一、從BindingList中讀取數據
BindingList是.NET Framework中的一個強類型數據結構,它繼承自IList介面,添加了一些便捷的事件和方法,可以方便地將數據和控制項進行綁定,實現數據綁定。
BindingList的常用操作包括添加、刪除和修改數據等。下面是一個從BindingList中讀取數據的示例:
BindingList<Student> studentList = new BindingList<Student>(); //創建一個BindingList
studentList.Add(new Student() { Name = "Tom", Age = 18, Gender = "Male" }); //添加數據
foreach(Student student in studentList) //遍曆數據
{
MessageBox.Show(student.Name + ":" + student.Age + "歲," + student.Gender); //彈出消息框顯示數據
}
二、BindingList清空操作之後報錯
如果在對BindingList進行Clear操作後,嘗試從中讀取數據,可能會拋出「沒有項可以與此位置關聯」異常。這是由於Clear方法會刪除BindingList中的所有元素,但不會將元素的引用也一併刪除,導致數據讀取時出現錯誤。解決方法是對BindingList重新進行實例化,如下所示:
BindingList<Student> studentList = new BindingList<Student>(); //創建一個BindingList studentList.Clear(); //清空操作 studentList = new BindingList<Student>(); //重新實例化
三、BindingList欄位重複
如果使用BindingList進行數據綁定時,遇到欄位重複的情況,則需要將欄位名指定為「別名」,以避免衝突。例如,如果兩個欄位均命名為「Name」,則可以將其中一個欄位命名為「Name2」,如下所示:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string Name2 { get { return this.Name; } set { this.Name = value; } } //指定別名
}
四、BindingList的foreach方法不見了
使用foreach方法遍歷BindingList是一個常見的操作,但是在某些情況下,可能會出現未定義方法的錯誤提示。這是由於BindingList並沒有直接實現IEnumerable<T>介面,而是通過IEnumerable介面進行實現。解決方法是使用cast轉換,將BindingList強制轉換為IEnumerable<T>類型,如下所示:
BindingList<Student> studentList = new BindingList<Student>(); //創建一個BindingList
foreach (Student student in (IEnumerable<Student>)studentList) //通過cast轉換實現遍歷
{
Console.WriteLine(student.Name + ":" + student.Age + "歲," + student.Gender); //控制台輸出數據
}
五、BindingList大數據量綁定
使用BindingList進行大數據量的數據綁定可能會影響程序性能,導致資源浪費,甚至出現程序崩潰等問題。為了解決這個問題,可以使用虛擬模式(Virtual Mode)進行數據綁定。虛擬模式是指只將當前可見的數據載入到內存中,當用戶滾動時動態載入前後的數據,以確保程序的高效和流暢。下面是一個使用虛擬模式的示例:
public class VirtualListDemo : Form
{
private DataGridView dataGridView1;
private BindingList<Student> studentList = new BindingList<Student>();
public VirtualListDemo()
{
dataGridView1.VirtualMode = true; //啟用虛擬模式
dataGridView1.VirtualRowCount = 1000; //設置虛擬行數
dataGridView1.CellValueNeeded += DataGridView1_CellValueNeeded; //綁定CellValueNeeded事件
}
private void DataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (studentList.Count > e.RowIndex) //判斷是否超出BindingList的數據範圍
{
Student student = studentList[e.RowIndex];
switch (dataGridView1.Columns[e.ColumnIndex].Name) //根據列名讀取數據
{
case "Name":
e.Value = student.Name;
break;
case "Age":
e.Value = student.Age;
break;
case "Gender":
e.Value = student.Gender;
break;
}
}
}
}
六、BindingList可以和樹控制項綁定嗎?
可以使用BindingList和TreeView控制項進行數據綁定。使用BindingList綁定TreeView的方法是將具有父子關係的節點轉換為樹形結構,使用遞歸演算法進行處理。下面是一個綁定TreeView的示例:
public class TreeNodeDemo : Form
{
private TreeView treeView1;
private BindingList<TreeNode> nodeList = new BindingList<TreeNode>();
public TreeNodeDemo()
{
treeView1.NodeMouseClick += TreeView1_NodeMouseClick; //綁定NodeMouseClick事件
BindTree(); //綁定樹形結構數據
}
private void BindTree()
{
nodeList.Add(new TreeNode("父節點1")
{
Nodes =
{
new TreeNode("子節點1"),
new TreeNode("子節點2")
}
}); //添加數據
nodeList.Add(new TreeNode("父節點2")); //添加數據
treeView1.Nodes.Clear();
foreach (TreeNode node in nodeList)
{
treeView1.Nodes.Add(node); //添加節點
}
}
private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
MessageBox.Show(e.Node.Text); //彈出消息框顯示節點內容
}
}
七、BindingList出現索引0沒有對象
如果在對BindingList進行操作時出現「索引0沒有對象」的錯誤,可能是由於綁定的數據源為空導致的。解決方法是在使用BindingList之前,先進行判斷數據源是否為空,如下所示:
BindingList<Student> studentList = new BindingList<Student>(); //創建一個BindingList
if(dataTable != null && dataTable.Rows.Count > 0) //判斷數據源是否為空
{
foreach(DataRow row in dataTable.Rows)
{
studentList.Add(new Student() { Name = row["Name"], Age = row["Age"], Gender = row["Gender"] }); //添加數據
}
}
八、BindingList和Dapper
Dapper是一種輕量級的ORM(對象關係映射)工具,可以方便地實現對資料庫的操作,而BindingList是實現數據綁定的一種常用工具。將Dapper和BindingList結合使用,可以更加方便地對資料庫進行操作,並實現自動數據綁定的效果。下面是一個使用Dapper和BindingList的示例:
public class DapperDemo : Form
{
private BindingList<Product> productList = new BindingList<Product>();
public DapperDemo()
{
dataGridView1.DataSource = productList; //將DataGridView和BindingList進行綁定
LoadData(); //載入數據
}
private void LoadData()
{
string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connectionString))
{
productList = conn.Query<Product>("SELECT * FROM Products").ToBindingList(); //使用Dapper查詢數據,將結果轉換為BindingList
dataGridView1.DataSource = productList; //更新DataGridView的數據源
}
}
}
原創文章,作者:EEPN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/148250.html
微信掃一掃
支付寶掃一掃