一文掌握C# ListView控件的用法和示例代碼
ListView
是一種多列的列表視圖控件,可以用于展示多個(gè)數(shù)據(jù)項(xiàng)及其相關(guān)信息。ListView
控件提供了豐富的屬性和事件,可以用于實(shí)現(xiàn)各種各樣的表格視圖,包括帶有單元格編輯、排序和分組等功能。
下面我們通過(guò)幾個(gè)示例來(lái)演示如何使用 ListView
控件。
示例一:基本使用
在這個(gè)示例中,我們將創(chuàng)建一個(gè)基本的 ListView
控件,并在其中添加三列數(shù)據(jù) —— 姓名、電話和地址。我們將使用 Items
屬性向 ListView
控件中添加數(shù)據(jù),每位客戶信息將占用 ListView
中的一行,每個(gè)屬性將在一行中的不同列中顯示。以下是示例代碼:
private void Form1_Load(object sender, EventArgs e) { // 創(chuàng)建三列,分別代表姓名、電話和地址 var colName = new ColumnHeader(); colName.Text = "姓名"; colName.Width = 100; var colPhone = new ColumnHeader(); colPhone.Text = "電話"; colPhone.Width = 150; var colAddress = new ColumnHeader(); colAddress.Text = "地址"; colAddress.Width = 200; // 添加列到 ListView 控件中 listView1.Columns.Add(colName); listView1.Columns.Add(colPhone); listView1.Columns.Add(colAddress); // 添加客戶信息到 ListView 控件中 ListViewItem item1 = new ListViewItem("張三"); item1.SubItems.Add("123456789"); item1.SubItems.Add("北京市海淀區(qū)"); ListViewItem item2 = new ListViewItem("李四"); item2.SubItems.Add("234567890"); item2.SubItems.Add("上海市浦東新區(qū)"); ListViewItem item3 = new ListViewItem("王五"); item3.SubItems.Add("345678901"); item3.SubItems.Add("廣州市天河區(qū)"); listView1.Items.Add(item1); listView1.Items.Add(item2); listView1.Items.Add(item3); }
在這個(gè)代碼中,我們首先創(chuàng)建了三個(gè) ColumnHeader
對(duì)象,分別表示列表視圖中的三列 —— 姓名、電話和地址。我們使用 Text
屬性來(lái)設(shè)置每列的標(biāo)題,使用 Width
屬性來(lái)設(shè)置每列的寬度,然后添加這三列到 ListView
控件中。在添加每列時(shí),我們將其添加到 Columns
集合中,從而在列表視圖中創(chuàng)建新列。
接下來(lái),我們使用 ListViewItem
對(duì)象和 SubItems
屬性來(lái)填充每一行的數(shù)據(jù)。在這個(gè)示例中,我們手動(dòng)創(chuàng)建了三個(gè)對(duì)象,每個(gè)對(duì)象分別代表一個(gè)客戶的姓名、電話和地址。我們將每個(gè)對(duì)象添加到 Items
集合中,從而在列表視圖中創(chuàng)建新的行。我們使用 Add
方法添加每個(gè) ListViewItem
對(duì)象到 Items
集合中,從而在列表視圖中創(chuàng)建新行。我們使用 SubItems
屬性來(lái)添加每個(gè)行中的列屬性,這可以幫助我們顯示多列數(shù)據(jù)。
示例二:動(dòng)態(tài)添加和刪除行
在這個(gè)示例中,我們將動(dòng)態(tài)地添加和刪除行。我們創(chuàng)建了兩個(gè)按鈕,一個(gè)用于添加行,一個(gè)用于刪除選中的行。我們將添加兩個(gè)事件處理程序,來(lái)響應(yīng)用戶單擊這兩個(gè)按鈕的操作。以下是示例代碼:
private void btnAdd_Click(object sender, EventArgs e) { // 顯示一個(gè)對(duì)話框,引導(dǎo)用戶輸入新的客戶信息(姓名、電話、地址) using (var dlg = new AddCustomerDialog()) { var result = dlg.ShowDialog(); if (result == DialogResult.OK) { // 當(dāng)用戶單擊“確定”按鈕時(shí),添加一行數(shù)據(jù)到 ListView 控件中 var item = new ListViewItem(dlg.Customer.Name); item.SubItems.Add(dlg.Customer.Phone); item.SubItems.Add(dlg.Customer.Address); listView1.Items.Add(item); } } } private void btnDelete_Click(object sender, EventArgs e) { // 刪除選中的行 foreach (ListViewItem item in listView1.SelectedItems) { listView1.Items.Remove(item); } }
在這個(gè)代碼中,我們首先創(chuàng)建了兩個(gè)事件處理程序,一個(gè)用于添加行,一個(gè)用于刪除選中的行。在添加行的事件處理程序中,我們使用 AddCustomerDialog
模式對(duì)話框,引導(dǎo)用戶輸入新的客戶信息。當(dāng)用戶單擊“確定”按鈕時(shí),我們獲取模式對(duì)話框中輸入的客戶信息,創(chuàng)建一個(gè)新的 ListViewItem
的 ListViewItem
對(duì)象并將其添加到 ListView
控件的項(xiàng)集合中,從而在列表視圖中創(chuàng)建新行。注意,我們?cè)谔砑有滦兄?,需要先檢查用戶單擊了模式對(duì)話框的“確定”按鈕,確保用戶輸入了有效的客戶信息。在刪除選中行的事件處理程序中,我們簡(jiǎn)單地遍歷 SelectedItems
集合,對(duì)于每個(gè)選定的 ListViewItem
對(duì)象,使用 Remove
方法將其從 ListView
控件的項(xiàng)集合中移除。刪除行的過(guò)程中,我們沒(méi)有檢查是否選擇了任何行,但需要注意,如果未選擇任何行,則 SelectedItems
集合將為空,而刪除行的代碼將什么也不做。
示例三:自定義列
在這個(gè)示例中,我們將向 ListView
控件中添加一個(gè)具有自定義列的數(shù)據(jù)。我們將創(chuàng)建一個(gè)新的 ListView
子類,覆蓋 OnCreateControl
方法以向控件中添加自定義列。在自定義列的列標(biāo)題區(qū)域中,我們將添加一個(gè)新的按鈕控件,用于在列標(biāo)題被單擊時(shí)觸發(fā)事件。以下是示例代碼:
public class CustomListView : ListView { private ColumnHeader customColumnHeader = null; protected override void OnCreateControl() { base.OnCreateControl(); AddCustomColumn(); } private void AddCustomColumn() { // 創(chuàng)建自定義列表頭 customColumnHeader = new ColumnHeader(); customColumnHeader.Text = "操作"; customColumnHeader.Width = 100; this.Columns.Add(customColumnHeader); // 添加按鈕到自定義列表頭中 var btn = new Button(); btn.Text = "新建客戶"; btn.AutoSize = true; btn.Click += (sender, e) => { // TODO: 在這里添加新客戶的代碼 }; customColumnHeader.TextAlign = HorizontalAlignment.Center; customColumnHeader.Control = btn; } }
在這個(gè)代碼中,我們創(chuàng)建了一個(gè)名為 CustomListView
的新類,并繼承了 ListView
。我們覆蓋了 OnCreateControl
方法,在控件第一次創(chuàng)建時(shí)添加了一個(gè)自定義列。我們創(chuàng)建了一個(gè) ColumnHeader
對(duì)象來(lái)表示自定義列的列頭,將自定義列添加到控件的 Columns
集合中。我們?cè)?nbsp;ColumnHeader
控件的 Control
屬性中添加了按鈕控件,該按鈕控件將出現(xiàn)在列頭中。在點(diǎn)擊按鈕時(shí),我們可能通過(guò)添加代碼來(lái)處理與新客戶相關(guān)的操作。
值得注意的是,為了確保按鈕僅占列頭中的一部分,我們通過(guò) AutoSize
屬性來(lái)將控件的大小調(diào)整為其包含的內(nèi)容同樣的大小,從而將按鈕置于列頭的最前面。我們通過(guò) TextAlign
屬性和 HorizontalAlignment.Center
值來(lái)使按鈕在整個(gè)列頭中居中。
這個(gè)示例只是展示了如何向 ListView
控件中添加具有自定義列的數(shù)據(jù),而按鈕的具體事件處理程序需要根據(jù)具體的需求來(lái)自行定義。
當(dāng)然有,這里再介紹一下 ListView
控件的集成視圖模式和虛擬模式。
集成視圖模式
集成視圖模式允許將數(shù)據(jù)通過(guò)關(guān)聯(lián)到 ListView
控件來(lái)顯示。在這個(gè)模式下,我們可以指定一個(gè)數(shù)據(jù)源,該數(shù)據(jù)源必須實(shí)現(xiàn) IList
接口。在這個(gè)模式下,當(dāng)我們向 Items
集合中添加數(shù)據(jù)時(shí),實(shí)際上是將數(shù)據(jù)項(xiàng)添加到數(shù)據(jù)源中。以下是使用集成視圖模式實(shí)現(xiàn)的示例代碼:
private void Form1_Load(object sender, EventArgs e) { // 創(chuàng)建數(shù)據(jù)源 var customers = new List<Customer>(); customers.Add(new Customer() { Name = "張三", Phone = "123456789", Address = "北京市海淀區(qū)" }); customers.Add(new Customer() { Name = "李四", Phone = "234567890", Address = "上海市浦東新區(qū)" }); customers.Add(new Customer() { Name = "王五", Phone = "345678901", Address = "廣州市天河區(qū)" }); // 關(guān)聯(lián)數(shù)據(jù)源和 ListView 控件 listView1.View = View.Details; listView1.VirtualListSize = customers.Count; listView1.RetrieveVirtualItem += (s, args) => { var customer = customers[args.ItemIndex]; args.Item = new ListViewItem(customer.Name); args.Item.SubItems.Add(customer.Phone); args.Item.SubItems.Add(customer.Address); }; }
在這個(gè)代碼中,我們創(chuàng)建了一個(gè) List<Customer>
對(duì)象,并添加了幾個(gè)客戶信息。然后,我們將 View
屬性設(shè)置為 Details
,并將 VirtualListSize
屬性設(shè)置為數(shù)據(jù)源的大小。我們使用 RetrieveVirtualItem
事件來(lái)提供數(shù)據(jù)。在這個(gè)事件中,我們使用 ListViewItem
和 SubItems
屬性來(lái)向 ListView
控件中填充每行的數(shù)據(jù)。使用虛擬列表改進(jìn)了數(shù)據(jù)量較大時(shí)的渲染速度。
虛擬模式
當(dāng)我們需要顯示大量數(shù)據(jù)時(shí),使用虛擬模式可以顯著提高 ListView
控件的性能。在虛擬模式下,ListView
控件只在需要顯示時(shí)才從數(shù)據(jù)源中檢索數(shù)據(jù)。以下是使用虛擬模式實(shí)現(xiàn)的示例代碼:
private void Form1_Load(object sender, EventArgs e) { // 創(chuàng)建數(shù)據(jù)源 var customers = new List<Customer>(); for (int i = 1; i <= 100000; i++) { customers.Add(new Customer() { Name = $"客戶{i}", Phone = $"Phone {i}", Address = $"Address {i}" }); } // 設(shè)置列表視圖的樣式和虛擬模式 listView1.View = View.Details; listView1.VirtualMode = true; listView1.VirtualListSize = customers.Count; // 為列添加數(shù)據(jù) listView1.Columns.Add("姓名"); listView1.Columns.Add("電話"); listView1.Columns.Add("地址"); listView1.RetrieveVirtualItem += (s, args) => { var customer = customers[args.ItemIndex]; var item = new ListViewItem(customer.Name); item.SubItems.Add(customer.Phone); item.SubItems.Add(customer.Address); args.Item = item; }; }
在這個(gè)代碼中,我們創(chuàng)建了一個(gè)包含 100,000 條客戶信息的數(shù)據(jù)源,并將 VirtualMode
屬性設(shè)置為 true
。然后,我們將 View
屬性設(shè)置為 Details
,并為每列添加的標(biāo)題。在 RetrieveVirtualItem
事件中在 RetrieveVirtualItem
事件中,我們首先獲取 itemIndex
對(duì)應(yīng)的數(shù)據(jù)項(xiàng),然后將其添加到 ListViewItem
對(duì)象中并通過(guò) args.Item
返回該項(xiàng),從而使它在控件中顯示。注意,由于在虛擬模式下,只有控件需要顯示的項(xiàng)才會(huì)從數(shù)據(jù)源中檢索,因此該事件在控件滾動(dòng)時(shí)會(huì)被多次調(diào)用,以獲取相應(yīng)項(xiàng)的數(shù)據(jù)。
需要注意的是,使用虛擬模式時(shí),如果要添加行、刪除行或者更新行等操作,我們需要在數(shù)據(jù)源中進(jìn)行相應(yīng)的修改,而不是直接在 Items
集合中進(jìn)行相應(yīng)的操作。
使用虛擬模式時(shí),控件只會(huì)從數(shù)據(jù)源中檢索需要顯示的數(shù)據(jù),而不會(huì)將整個(gè)數(shù)據(jù)源加載到內(nèi)存中。因此,在大量數(shù)據(jù)的情況下,虛擬模式可以有效節(jié)省內(nèi)存和提高控件性能。
以上是一些常見(jiàn)的 ListView
控件的用法和示例代碼。當(dāng)然,ListView
控件的功能遠(yuǎn)不止于此,還提供了許多其他的屬性和事件,如單元格編輯、排序、分組、滿屏顯示等,您可以根據(jù)自己的需求自由選擇和使用。
到此這篇關(guān)于一文掌握C# ListView 的用法的文章就介紹到這了,更多相關(guān)C# ListView 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- c# winform treelistview的使用(treegridview)實(shí)例詳解
- C#中WPF ListView綁定數(shù)據(jù)的實(shí)例詳解
- C# WPF ListView控件的實(shí)例詳解
- C# ListView 點(diǎn)擊表頭對(duì)數(shù)據(jù)進(jìn)行排序功能的實(shí)現(xiàn)代碼
- C#實(shí)現(xiàn)在listview中插入圖片實(shí)例代碼
- C#中ListView控件實(shí)現(xiàn)窗體代碼
- C#下listview如何插入圖片
- C#實(shí)現(xiàn)listview Group收縮擴(kuò)展的方法
- C#實(shí)現(xiàn)帶進(jìn)度條的ListView
- C#實(shí)現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法
相關(guān)文章
c#中l(wèi)ist.FindAll與for循環(huán)的性能對(duì)比總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于c#中l(wèi)ist.FindAll與for循環(huán)的性能,文中通過(guò)詳細(xì)的示例代碼給大家介紹了這兩者之間的性能,對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10C# 添加對(duì)System.Configuration.dll文件的引用操作
這篇文章主要介紹了C# 添加對(duì)System.Configuration.dll文件的引用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Unity2021發(fā)布WebGL與網(wǎng)頁(yè)交互問(wèn)題的解決
本文主要介紹了Unity2021發(fā)布WebGL與網(wǎng)頁(yè)交互問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05舊項(xiàng)目升級(jí)新版Unity2021導(dǎo)致Visual?Studio無(wú)法使用的問(wèn)題
在項(xiàng)目開發(fā)過(guò)程中,不可避免的會(huì)升級(jí)開發(fā)工具。這次我在舊項(xiàng)目版本升級(jí)到新版Unity2021.2.x時(shí),出現(xiàn)Visual?Studio無(wú)法定位等問(wèn)題,這里我給大家分享下解決方法,舊項(xiàng)目升級(jí)新版Unity2021導(dǎo)致Visual?Studio無(wú)法使用的問(wèn)題,需要的朋友可以參考下2021-12-12C#使用Pipelines實(shí)現(xiàn)處理Socket數(shù)據(jù)包
這篇文章主要為大家詳細(xì)介紹了C#如何使用Pipelines實(shí)現(xiàn)處理Socket數(shù)據(jù)包,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12