DataGridViewColumnCollection置空DataSource后莫名重置原因咨询
为什么置空DataGridView的DataSource会导致Columns集合被重置?
首先咱们先看你这段代码:
private DataGridViewColumnCollection columns; private void RemoveStaffFromList(object sender, EventArgs e) { columns = dataGridViewStaff.Columns; MessageBox.Show(columns.Count.ToString()); dataGridViewStaff.DataSource = null; MessageBox.Show(columns.Count.ToString()); }
你疑惑的点在于:columns是个独立变量,为啥置空DataSource后它的Count也跟着变了?其实这里有个关键误解——你并没有拿到一个独立的列集合副本。
dataGridViewStaff.Columns返回的是DataGridView内部维护的列集合的引用,不是一个新的、和原集合断开联系的副本。也就是说,你的columns变量只是“指向”了DataGridView自己管的那个列集合,而不是把这个集合复制了一份存起来。
当你把DataSource设为null时,DataGridView会自动清理所有通过数据源绑定生成的列(毕竟没了数据源,这些列也就失去了存在的依据),这时候它内部的列集合就被清空了。而你的columns变量因为一直指向这个被清空的集合,所以第二次MessageBox自然就返回0了。
如果想要保留原来的列集合不受DataSource变化影响,你需要手动创建一个独立的副本,比如用List来复制:
// 创建一个独立的列列表副本 var columnsCopy = new List<DataGridViewColumn>(); foreach (DataGridViewColumn col in dataGridViewStaff.Columns) { columnsCopy.Add(col); }
这样之后哪怕DataGridView的Columns被清空,columnsCopy里的内容还是原来的那些列,不会跟着变。
内容的提问来源于stack exchange,提问作者PeterDoesStuff
相关产品推荐
相关产品推荐

