for (int i = 0; i < dt.Rows.Count; i++) {
ListViewItem item = new ListViewItem();
item.Text = dt.Rows[i]["G_Title"].ToString();
listView1.Items.Add(item.Text); // 錯誤:Add 接受 string 會新建項,非加入現有 item
text += item.Text;
}
詢問:「如何顯示項與項之間的間隔是一樣的」。
ColumnHeader.Width 屬性決定。listView1.Columns[0].Width = 200; 或設計器屬性設置。ItemHeight(Details 模式下不可直接設)統一計算,**無需額外代碼保證一致**。
listView1.View = View.Details;
listView1.Columns.Clear();
listView1.Columns.Add("標題", 300); // 列寬 300px
foreach (DataRow row in dt.Rows) {
var item = new ListViewItem(row["G_Title"].ToString());
// 若有多列:item.SubItems.Add(row["Col2"].ToString());
listView1.Items.Add(item); // 加入 ListViewItem 對象,而非 string
}
若數據超過數萬行,啟用 listView1.VirtualMode = true,處理 RetrieveVirtualItem 事件按需提供 ListViewItem,極大降低內存佔用與初始化時間。
| 誤區 | 正確認知 |
|---|---|
Items.Add(string) 以為加入自建 item | 該重載會新建一個 ListViewItem,原 item 被忽略,SubItems 丟失 |
| 以為需手動計算行高保證一致 | WinForms ListView 行高由控件統一渲染,天然一致 |
試圖用 ItemHeight 設置行高 | 僅在 View = List/Tile 時生效,Details 模式無效 |
ListView 列寬靠 ColumnHeader.Width,行距天然一致。綁定時用 Items.Add(ListViewItem) 而非 Add(string),大數據啟用虛擬模式。