绑定List<Memo>后DataGridView不显示数据问题排查
我有一个由用户输入生成的List,已绑定到数据源类,同时有一个DataGridView用于展示该数据。相关代码如下:
ViewMemo_Load方法:
private void ViewMemo_Load(object sender, EventArgs e) { dgvMemo.DataSource = Datasources.memorecorders; }
AddMemo类的btAdd_Click方法:
private void btAdd_Click(object sender, EventArgs e) { int SerialId; SerialId = int.Parse(txtSerialId.Text); decimal price; price = decimal.Parse(txtPrijs.Text); MemoRecorder m1 = new MemoRecorder(SerialId); m1.make = txtMerk.Text; m1.model = txtModel.Text; m1.priceExBtw = price; m1.creationDate = dtProductie.Value; foreach (MemoCartridgeType mem in Enum.GetValues(typeof(MemoCartridgeType))) { if (cbCartridge.SelectedValue.ToString() == mem.ToString()) { m1.maxCartridgeType = mem; } } Datasources.memorecorders.Add(m1); MessageBox.Show("uitkomst: Merk: " + m1.make + "model: " + m1.model + " ,prijs Ex btw: "+ m1.priceExBtw + " ,CartridgeType: "+ m1.maxCartridgeType + " ,Creatie Datum: " + m1.creationDate); txtMerk.Text = String.Empty; txtModel.Text = String.Empty; txtPrijs.Text = String.Empty; }
但添加数据后,DataGridView中并未显示新增数据,请问问题出在哪里?
嘿,这个问题我碰到过好多次了!核心原因很简单:你用的List<MemoRecorder>没有自带数据变更通知机制,DataGridView根本不知道你往里面加了新数据,自然不会自动刷新界面。
给你两个解决办法,按需选择:
方法一:手动触发DataGridView刷新(快速临时方案)
在你添加完新的MemoRecorder之后,手动重置一下DataGridView的数据源,让它重新读取数据:
// 先清空数据源,再重新绑定 dgvMemo.DataSource = null; dgvMemo.DataSource = Datasources.memorecorders;
不过这个方法有个小缺点:会重置DataGridView的列状态(比如用户调整过的列宽、排序会回到默认),适合简单场景临时用。
方法二:改用BindingList(推荐的优雅方案)
把Datasources里的memorecorders类型从List<MemoRecorder>改成BindingList<MemoRecorder>。BindingList<T>实现了IBindingList接口,当你添加、删除元素时,会自动通知绑定的DataGridView更新界面,完全不需要手动刷新。
步骤很简单:
- 修改数据源定义:
// 原来的List改成BindingList public static BindingList<MemoRecorder> memorecorders = new BindingList<MemoRecorder>();
- 你的绑定代码
dgvMemo.DataSource = Datasources.memorecorders;不需要改,之后每次调用Datasources.memorecorders.Add(m1);,DataGridView都会自动显示新增的记录,完美解决问题!
另外提个小建议:如果之后你需要修改已存在的MemoRecorder属性(比如改价格、型号),也想让DataGridView自动更新,那你需要让MemoRecorder类实现INotifyPropertyChanged接口,不过这是进阶需求,先解决当前的新增显示问题就够啦。
内容的提问来源于stack exchange,提问作者mika grijpma

