本鳥,剛學winform。第一個數據控件就是碰到了listview。
以下是我了解到的幾個知識點,網上搜了好久,才實現以下功能。希望對新手有所幫助
1.創建表頭

#region 給listview加表頭: lvList.Columns.AddRange(new ColumnHeader[] { new ColumnHeader(){ Name="Mac",Text="Mac",Width=100}, new ColumnHeader(){ Name="Ip",Text="Ip地址",Width=100}, new ColumnHeader(){ Name="Port",Text="Port",Width=100}, new ColumnHeader(){ Name="Protocol",Text="Protocol",Width=100}, new ColumnHeader(){ Name="PackId",Text="AccessTime",Width=100}, new ColumnHeader(){ Name="AccessTime",Text="AccessTime",Width=100}, }); //選中一行 lvList.FullRowSelect = true; #endregion
2.把數據綁定到listview上

#region 把序列化后的數據顯示到listview上: lvList.Items.Clear(); foreach (CustomerServ result in rd.Results) { var lvi = new ListViewItem(result.Mac); lvi.SubItems.Add(result.Ip); lvi.SubItems.Add(result.Port.ToString()); lvi.SubItems.Add(result.Protocol); lvi.SubItems.Add(result.PackId.ToString()); lvi.SubItems.Add(result.AccessTime.ToString("yyyy-MM-dd HH:mm:ss")); lvList.Items.Add(lvi); } var c = 0; #endregion
3.讀取行數據

#region 單擊行讀取行數據: if (this.lvList.SelectedItems.Count > 0) { txtClient.Text = this.lvList.SelectedItems[0].SubItems[0].Text; txtIP.Text = this.lvList.SelectedItems[0].SubItems[1].Text; txtPort.Text = this.lvList.SelectedItems[0].SubItems[2].Text; txtProtocol.Text = this.lvList.SelectedItems[0].SubItems[3].Text; txtPackId.Text = this.lvList.SelectedItems[0].SubItems[4].Text; txtAccessTime.Text = this.lvList.SelectedItems[0].SubItems[5].Text; } #endregion
4.給listview顯示數據的第一行加上checkbox

//簡單的一個東西,我找了很久 lvList.CheckBoxes = true;
5.遍歷刪除listview中checkbox被選中的記錄

/// <summary> /// 刪除選中行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDelete_Click(object sender, EventArgs e) { foreach (ListViewItem item in this.lvList.CheckedItems) { this.lvList.Items.RemoveAt(item.Index); } }
6.checkbox的checked為true行變紅,false時黑色

private void lvList_ItemChecked(object sender, ItemCheckedEventArgs e) { ListViewItem MyItem = lvList.Items[e.Item.Index]; foreach (ListViewItem item in this.lvList.Items) { if (MyItem.Checked) { MyItem.ForeColor = System.Drawing.Color.Red; } else { MyItem.ForeColor = System.Drawing.Color.Black; } } }
7.遍歷listview,把上面的數據存到list<T>中

List<CustomerServ> m_CustomerServList = new List<CustomerServ>(); foreach (ListViewItem item in lvList.Items) { m_CustomerServList.Add(new CustomerServ() { Mac = item.SubItems[0].Text, Ip = item.SubItems[1].Text, Port = item.SubItems[2].Text, Protocol = item.SubItems[3].Text, PackId = Convert.ToInt32(item.SubItems[4].Text), AccessTime = Convert.ToDateTime(item.SubItems[5].Text) }); }
8.listview根據列名自動調整列寬

lvList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
9.listview列排序

//使用 IComparer接口。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Windows.Forms; namespace EtcommTest { class ListViewColumnSorter : IComparer { private int ColumnToSort;// 指定按照哪個列排序 private SortOrder OrderOfSort;// 指定排序的方式 private CaseInsensitiveComparer ObjectCompare;// 聲明CaseInsensitiveComparer類對象, public ListViewColumnSorter()// 構造函數 { ColumnToSort = 0;// 默認按第一列排序 OrderOfSort = SortOrder.None;// 排序方式為不排序 ObjectCompare = new CaseInsensitiveComparer();// 初始化CaseInsensitiveComparer類對象 } // 重寫IComparer接口. // <returns>比較的結果.如果相等返回0,如果x大於y返回1,如果x小於y返回-1</returns> public int Compare(object x, object y) { int compareResult; ListViewItem listviewX, listviewY; // 將比較對象轉換為ListViewItem對象 listviewX = (ListViewItem)x; listviewY = (ListViewItem)y; // 比較 compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); // 根據上面的比較結果返回正確的比較結果 if (OrderOfSort == SortOrder.Ascending) { // 因為是正序排序,所以直接返回結果 return compareResult; } else if (OrderOfSort == SortOrder.Descending) { // 如果是反序排序,所以要取負值再返回 return (-compareResult); } else { // 如果相等返回0 return 0; } } /// 獲取或設置按照哪一列排序. public int SortColumn { set { ColumnToSort = value; } get { return ColumnToSort; } } /// 獲取或設置排序方式. public SortOrder Order { set { OrderOfSort = value; } get { return OrderOfSort; } } } } *********************************** public Main() { InitializeComponent(); // 創建一個ListView排序類的對象,並設置lvList的排序器 lvwColumnSorter = new ListViewColumnSorter(); this.lvList.ListViewItemSorter = lvwColumnSorter; } ListViewColumnSorter lvwColumnSorter; //單擊列標頭時觸發 private void lvList_ColumnClick(object sender, ColumnClickEventArgs e) { // 檢查點擊的列是不是現在的排序列. if (e.Column == lvwColumnSorter.SortColumn) { // 重新設置此列的排序方法. if (lvwColumnSorter.Order == SortOrder.Ascending) { lvwColumnSorter.Order = SortOrder.Descending; } else { lvwColumnSorter.Order = SortOrder.Ascending; } } else { // 設置排序列,默認為正向排序 lvwColumnSorter.SortColumn = e.Column; lvwColumnSorter.Order = SortOrder.Ascending; } // 用新的排序方法對ListView排序 this.lvList.Sort(); }
10.listview分頁

private static int totalcount = 0;//記錄數 private static int pageIndex = 1; //當前頁 private static int pageSize = 10; //每頁條數 private static int pageCount = (totalcount / pageSize) + (totalcount % pageSize == 0 ? 0 : 1); //總頁數 public List<LogItem> Items; #region Listview分頁: private void CalcPageStatus(List<LogItem> MyList, int pageSize, int pIndex) { totalcount = MyList.Count; pageCount = (totalcount / pageSize) + (totalcount % pageSize == 0 ? 0 : 1); pageIndex = pIndex; if (null == MyList) { return; } var list = new List<LogItem>(); //跳到首頁 if (pageIndex == 1) { if (totalcount > pageSize) { for (int i = 0; i < pageSize; i++) { list.Add(MyList[i]); } if (pageCount == 1) { _tsbnextPage.Enabled = false; } else { _tsbnextPage.Enabled = true; } } else { for (int i = 0; i < totalcount; i++) { list.Add(MyList[i]); } _tsbnextPage.Enabled = false; } _tsbprevPage.Enabled = false; } //跳到尾頁 if (pageIndex >= pageCount && pageIndex > 1) { int count = MyList.Count - (pageCount - 1) * pageSize; for (int i = 0; i < count; i++) { list.Add(MyList[i + pageSize * (pageCount - 1)]); } if (pageIndex > 1) { _tsbprevPage.Enabled = true; } _tsbnextPage.Enabled = false; } //跳到中間頁 if (pageIndex > 1 && pageIndex < pageCount) { for (int i = 0; i < pageSize; i++) { list.Add(MyList[i + pageSize * (pageIndex - 1)]); } _tsbprevPage.Enabled = true; _tsbnextPage.Enabled = true; } _tsplblMessage.Text = " 總頁數:" + pageCount + " 每頁顯示:"; FillLvLogs(list); TsbCPageAddItem(); TsbCPageChange(); Color(); } /// <summary> /// 添加當前頁的Item /// </summary> public void TsbCPageAddItem() { _tsbCPage.Items.Clear(); for (int i = 0; i < pageCount; i++) { _tsbCPage.Items.Add(1 + i); } } /// <summary> /// 判斷當前頁顯示 /// </summary> public void TsbCPageChange() { flage = false; TsbCPageAddItem(); if (pageIndex == 1) { _tsbCPage.SelectedIndex = pageIndex - 1; } if (pageIndex >= pageCount && pageIndex > 1) { _tsbCPage.SelectedIndex = pageCount - 1; } if (pageIndex > 1 && pageIndex < pageCount) { _tsbCPage.SelectedIndex = pageIndex - 1; } flage = true; } /// <summary> /// 首頁 /// </summary> public void LvHomePage() { if (totalcount > 0) { CalcPageStatus(Items, pageSize, 1); } } /// <summary> /// 末頁 /// </summary> public void LvLastPage() { if (totalcount > 0) { CalcPageStatus(Items, pageSize, pageCount); } } /// <summary> /// 上一頁 /// </summary> public void LvPageDown() { int index = Convert.ToInt32(_tsbCPage.Text) - 1; CalcPageStatus(Items, pageSize, index); } /// <summary> /// 下一頁 /// </summary> public void LvPageUp() { int index = Convert.ToInt32(_tsbCPage.Text) + 1; CalcPageStatus(Items, pageSize, index); } #endregion
11.讓選中行失去焦點后仍然保持天藍色

/// <summary> /// listview的SelectedIndexChanged事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lvList_SelectedIndexChanged(object sender, EventArgs e) { if (lvList.FocusedItem != null) { if (this.lvList.SelectedItems.Count > 0) { if (lvList.SelectedItems[0].BackColor == SystemColors.Highlight) { lvList.SelectedItems[0].BackColor = Color.White; lvList.SelectedItems[0].ForeColor = Color.Black; lvList.SelectedItems.Clear(); } else { lvList.FocusedItem.BackColor = SystemColors.Highlight; lvList.FocusedItem.ForeColor = Color.White; } } } }
12.遍歷listview把選中的用戶生成一個字符串數組

string[] str = new string[lvClients.CheckedItems.Count]; for (int i = 0; i < lvClients.CheckedItems.Count; i++) { str[i] = lvClients.CheckedItems[i].Text; }
13.根據某些字段模糊查詢listview列表相關信息

private void btnSelectA_Click(object sender, EventArgs e) { string _Mac = this.txtMac.Text; string _IP = this.txtIP.Text; lvList.Items.Clear(); foreach (CustomerServ result in a.Results) { if (_Mac.Trim().Length < 1 && _IP.Trim().Length < 1) { var lvi = new ListViewItem(result.Mac); lvi.SubItems.Add(result.Ip); lvi.SubItems.Add(result.Port.ToString()); lvi.SubItems.Add(result.Protocol); lvi.SubItems.Add(result.PackId.ToString()); lvi.SubItems.Add(result.AccessTime.ToString("yyyy-MM-dd HH:mm:ss")); lvList.Items.Add(lvi); } else { if(Convert.ToInt32(result.Mac.IndexOf(_Mac,0))==0) { if (Convert.ToInt32(result.Ip.IndexOf(_IP, 0)) == 0) { var lvi = new ListViewItem(result.Mac); lvi.SubItems.Add(result.Ip); lvi.SubItems.Add(result.Port.ToString()); lvi.SubItems.Add(result.Protocol); lvi.SubItems.Add(result.PackId.ToString()); lvi.SubItems.Add(result.AccessTime.ToString("yyyy-MM-dd HH:mm:ss")); lvList.Items.Add(lvi); } } } } }