[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;
if(idx > -1) // 當沒有選 ListBox 項目時 idx 得 -1
{
orderList.RemoveAt(idx);
listBox1.Items.RemoveAt(idx); // 刪除 ListBox 上的項目
}
}
private void button2_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
}
}
ListView 基本使用和刪除
ListView 的 Details 顯示多了 Column Header(如同 HTML 的 table 中的 th 標籤)要設定,可以手動拉取一個 ListView ,在屬性視窗中找到
- View 設為 Details 或控制項右上角的向右箭頭選「檢視」為「Details」
- FullRowSelect 設為 true,當選擇項目時會全選整個 row
- GridLines 設為 true 可讓格線顯示
- Columns 點選更多,或控制項右上角的向右箭頭選「編輯資料行」:
左邊點選「加入」會新增一個標頭欄位,右邊有 Text 表示欄位名,Width 表欄位寬度,下圖手動增加三個欄位:
下面是程式碼新增與設定 ListView
namespace ListViewDemo
{
public partial class Form1 : Form
{
ListView listView1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
listView1 = new ListView
{
Size = new Size(400,300),
Location = new Point(100,100),
View = View.Details,
FullRowSelect = true
}
listView1.Columns.Add("品項",150); // Column 的 Text 和 Width
listView1.Columns.Add("單價",70);
listView1.Columns.Add("糖冰",150);
this.Controls.Add(listView1);
foreach(Order ord in orderList)
{
ListViewItem item = new ListViewItem(
new string[] {
ord.Name,
ord.Price.ToString(),
ord.SugarIce }
);
listView1.Items.Add(item);
}
}
private void button1_Click(object sender, EventArgs e)
{
if(listView1.FocusedItem == null) // 還沒選取任何內容時
{
return;
}
int idx = listView1.FocusedItem.Index; // 取得選取何列的 index
orderList.RemoveAt(idx);
listView1.Items.RemoveAt(idx);
}
private void button2_Click(object sender, EventArgs e)
{
listView1.Items.Clear(); // 注意不是listView1.Clear() ,這樣會連標頭都清光
}
}
}
用字串陣列來新增項目的寫法其實是快速的 overload:
foreach(Order ord in orderList)
{
ListViewItem item = new ListViewItem(
new string[] {
ord.Name,
ord.Price.ToString(),
ord.SugarIce }
);
listView1.Items.Add(item);
}
本來的寫法會更清楚 ListView 裡面項目是長什麼樣子:
foreach(Order ord in orderList)
{
ListViewItem item = new ListViewItem(ord.Name);
item.SubItems.Add(ord.Quantity.ToString());
item.SubItems.Add(ord.SugarIce);
listView1.Items.Add(item);
}
留言
張貼留言