如何在单元格编辑时更新 DataGridView 的数据源

时间:2021-08-01 15:12:29

标签: c# datagridview

我已通过下面的 Select 语句将我的类 Reports 附加到 dataGridView 的 DataSource,因为我不希望 Prop3 显示在 DGV 中。然后我更新了 cellClick 事件以删除 ReadOnly,因为这在初始运行过程中似乎是一个问题。

当我单击一个单元格并尝试将一个值更改为 123 时,一旦我按 Enter,它就会切换回 456。我曾尝试使用各种其他事件,例如 CellEndEdit、CellValueChanged,以及我认为可能对运气没有帮助的任何其他事件。我什至找不到在运行带有断点的代码时尝试更改为存储在任何地方的值 (123)。我想确保在单元格编辑完成后将 myClass 中的值设置为 123。如果我不使用 select 语句,那么所有 3 个属性都将显示在 DGV 中,然后我可以按照我要求的方式编辑值,但我不希望 Prop3 显示所以使用了 select 语句。

value  0  1
group      
A      1  2
B      2  2

1 个答案:

答案 0 :(得分:0)

<块引用>

因为我不希望 Prop3 出现在 DGV 中

在生成后从 DGV 中删除列要简单得多

var x = new List<MyClass>(){
  new MyClass(){ Prop1 = 1, Prop2 = 22, Prop3 = 4015559191 },
  new MyClass(){ Prop1 = "Fred", Prop2 = 23, Prop3 = "4015559002" },
};

感谢默认情况下 DataGridView 的 AutoGenerateColumns 属性为 true。当您绑定到 MyClass 列表时,DGV 将检查 MyClass 的属性并为其创建列,同时考虑数据类型和名称

没有什么能阻止你在之后编辑它的作品:

dataGridView1.DataSource = x;

dataGridView1.AutogenerateColumns = false; //turn it off so it doesn't later recreate removed columns
dataGridView1.Columns.Remove("Prop3"); //Prop3 property became a column named Prop3
<块引用>

我想确保在单元格编辑完成后将 myClass 中的值设置为 123。

但是,网格没有绑定到 myClass;当您在 ToList() 中执行 myClass.Select(...).ToList() 并将网格绑定到新列表时,您在内存中的其他地方创建了一个新的、不同的、完全独立的列表。

更糟糕的是,在 Select 中,您创建了新的匿名类型对象并将 MyClass 项的属性的数据内容复制过来,这完全断开了存储在 MyClass 中的 myClass 实例并将网格绑定到一个充满匿名类型的列表,这些类型恰好有数据的副本

<块引用>

当我点击一个单元格并尝试将一个值更改为 123 时,一旦我按下 Enter 键,它就会切换回 456

压倒骆驼的最后一根稻草是匿名类型是不可变的 - 你已经将你的网格绑定到一个全新的列表,其中充满了全新的只读匿名类型..

...网格永远不会影响myClass

的内容