發表文章

目前顯示的是 1月, 2022的文章

[C#] SQL Server 將資料表換成物件

圖片
用一個簡單的示範做個筆記。 SQL 中的資料 首先如果 SQL Server 本機「 . 」中有 mydb 資料庫,還有 DrinkData 資料表,欄位有 int Id、nvarchar(20) Name 和 int Price,語法與結果如下: 類別 希望將這些資料轉成 C# 中的物件,物件 Drink 有 int Id、string Name 和 int Price,類別中還有靜態的 List<Drink> drinkList 之後要用來存放從 SQL 中讀取資料轉成的 Drink 物件: namespace SqlToCSharpDemo { class Drink { public static List<Drink> drinkList = new List<Drink>(); // 靜態 List public int Id { get; set; } // 對應 SQL 中的 Id public string Name { get; set; } // 對應 SQL 中的 Name public int Price { get; set; } // 對應 SQL 中的 Price public Drink(int id, string name, int price) { this.Id = id; this.Name = name; this.Price = price; } } } 將資料表轉換成物件 有了類別定義就可以在 Form 中實體化物件,將 SQL Server 查詢出來的資料存放供之後使用: using System.Data.SqlClient; // SQL CRUD 需使用此命名空間 namespace SqlToCSharpDemo { public partial class Form1 : Form { string connectionString; public Form1() { InitializeComponent(); } ...

[C#] ListView 的 Details 顯示和刪除列

圖片
承上一篇: Windows Form 的 ListBox 排版對齊問題 ,經網友前輩們建議改用 ListView Details 來做訂單顯示,先看結果: 這個結果比較接近我們平常看到的 Excel 等二維表格,整齊漂亮對好。 ListBox 基本使用和刪除項目 介紹 ListView Details 之前先比較一下 ListBox 的建構方法和取出選擇項目的 index ,然後給旁邊的 Button button1 的 Click 事件中要刪除 ListBox 所選項目,而 button2 會清空訂單資料和 ListBox。 namespace ListBoxDemo { public partial class Form1 : Form { ListBox listBox1; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { listBox1 = new ListBox { Size = new Size(400,300), // ListBox 很陽春沒什麼好設定的 Location = new Point(100,100) // 大概就大小、位置、字型... }; this.Controls.Add(listBox1); foreach(Order ord in orderList) // 讓 Items 呼叫 .Add() 方法來新增項目 { listBox1.Items.Add(ord.Name + ord.Price + ord.SugarIce); } // 串接成一個字串 } private void button1_Click(object sender, EventArgs e) { int idx = listBox1.SelectedIndex; ...

[C#] Windows Form 的 ListBox 排版對齊問題

圖片
最近做簡易的訂單系統,將訂單輸出到 ListBox ,而 ListBox 的每一筆 record 叫作 Item 用字串賦值,如果每一筆 record 都只有一個簡單的值那還 OK,如果很多欄位要串成一個字串給 ListBox.Items.Add(),結果只能說亂到不行,例如下面是每筆訂單有飲料品項名、每杯單價、糖冰狀況: 單純輸出 foreach(Order ord in OrderList) { string item = $"{ord.Name},{ord.Price},{ord.SugarIce}"; listBox1.Items.Add(item); } 以上大概是像這樣單純的輸出,只是串接起會很醜無可厚非,那如果加上字串格式化呢?其實結果改善不了多少… 加上長度的字串格式化 foreach(Order ord in OrderList) { string item = $"{ord.Name,6},{ord.Price,4},{ord.SugarIce,-8}"; Console.WriteLine(item); listBox1.Items.Add(item); } 程式碼順便輸出到 console 一看,一樣是亂七八糟,這是發生了什麼事?原因大概在中文字 string.Length 是照字數算的,例如 "紅茶" 的.Length = 2,如果格式化排 6 個字,靠右對齊,就會在左邊補上 4 個空白字元,而 "起士鮮奶茶" 的.Length = 5,左邊補上 1 個空白字元,看起來很美好,但是為什麼 console 還是很亂?因為一個中文字會佔用 2 個英數字元的位置,造成右邊根本無法對齊,以"紅茶"與"起士鮮奶茶"為例,紅茶兩個中文字其實佔用 4 個英數字元,左邊如果再補上 4 個空白字元,格式化後會佔用 8 個英數字元,而起士鮮奶茶五個中文字其實佔用 10 個英數字元,左邊再 1 個空白字元,格式化共佔用 11 個字元,一個是 8 ,一個是 11 ,當然不齊了。 玩過 BBS 和 DOS 倚天系統的人應該對中文字會佔用 2 個英數字元的這件事很習慣了,所以本來我也以為 "...