BufDataGridView已导入行后无法逐行填充Test数据的技术求助
问题分析与解决
你当前代码的核心问题很明确:
- 每次循环都新建
Test对象,但完全没把这个对象和已绑定的SerialNo集合关联——SerialNo里已经有40个对应导入序列号的Test实例了,根本不需要重新创建,直接修改集合里的现有对象就行。 - 你用
staveEATData2.Rows[^2].Cells[0]设置当前单元格,[^2]是取倒数第二行,等于每次都选同一行,既没正确移动光标,也不是数据绑定模式下修改数据的正确方式(绑定模式下,改绑定集合才会同步到UI)。
修正后的代码
直接操作绑定的BindingList<Test>集合SerialNo,DataGridView和这个集合绑定后,修改集合内的元素会自动同步到界面,不需要手动操作单元格:
// 处理前20行(对应索引0到19) for (int i = 0; i < 20; i++) { // 直接取SerialNo中已有的Test对象,不用新建 Test targetTest = SerialNo[i]; // 填入实际测试数据,这里示例用0占位 targetTest.Test1 = 0; targetTest.Test2 = 0; } // 弹出设置对话框,等待用户调整配置 using (var settingDialog = new TestForm()) { settingDialog.ShowDialog(); } // 处理后20行(对应索引20到39) for (int i = 20; i < 40; i++) { Test targetTest = SerialNo[i]; targetTest.Test1 = 0; targetTest.Test2 = 0; }
额外注意事项
如果修改集合元素后界面没更新,大概率是Test类没实现INotifyPropertyChanged接口,需要给Test类加上这个接口,确保属性变更能通知UI刷新:
public class Test : INotifyPropertyChanged { private string _serialNo; private string _location; private int _test1; private int _test2; public string SerialNo { get => _serialNo; set { _serialNo = value; OnPropertyChanged(nameof(SerialNo)); } } public string Location { get => _location; set { _location = value; OnPropertyChanged(nameof(Location)); } } public int Test1 { get => _test1; set { _test1 = value; OnPropertyChanged(nameof(Test1)); } } public int Test2 { get => _test2; set { _test2 = value; OnPropertyChanged(nameof(Test2)); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
内容的提问来源于stack exchange,提问作者Robbie Schertz
相关产品推荐
相关产品推荐

