如何更简便地阻止DataGridView关联控件的事件触发?
更简便的解决方案
方法1:用布尔标志位跳过事件逻辑
定义一个类级别的布尔变量,用来标记当前是否是程序自动更新控件值的状态。在更新控件前把标志设为true,更新完成后设回false,然后在每个控件的事件处理方法开头判断这个标志——如果是true就直接返回,不执行保存回数组的逻辑。
示例代码:
// 类内定义的标志变量 private bool _isAutoUpdating = false; // DataGridView选中行变更时的处理逻辑 private void DataGridView_SelectionChanged(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 0) return; var selectedSample = _samplelist[dataGridView.SelectedRows[0].Index]; _isAutoUpdating = true; // 直接更新控件,不用移除事件 NUDsampVolume.Value = selectedSample.volume; NUDsampPitch.Value = selectedSample.pitch; NUDsampPan.Value = selectedSample.pan; NUDsampOffset.Value = selectedSample.offset; txtSampPath.Text = selectedSample.path; _isAutoUpdating = false; } // 以音量控件的事件处理为例 private void NUDsampVolume_ValueChanged(object sender, EventArgs e) { if (_isAutoUpdating) return; // 执行保存回数组的逻辑 var selectedIndex = dataGridView.SelectedRows[0].Index; _samplelist[selectedIndex].volume = (int)NUDsampVolume.Value; }
这种方法不用反复操作事件委托,代码更简洁,也避免了重复添加委托可能带来的问题。
方法2:用WinForms数据绑定自动同步
直接把控件和_samplelist中的对象绑定,WinForms会自动处理值同步,不会触发不必要的事件,还能省去手动写更新和保存的逻辑。
示例代码:
// 在窗体加载时设置数据绑定 private void Form_Load(object sender, EventArgs e) { // 把数组转成BindingList,支持自动通知 var bindingSampleList = new BindingList<Sample>(_samplelist); dataGridView.DataSource = bindingSampleList; // 将控件绑定到DataGridView的选中项属性 NUDsampVolume.DataBindings.Add("Value", dataGridView, "SelectedItem.volume"); NUDsampPitch.DataBindings.Add("Value", dataGridView, "SelectedItem.pitch"); NUDsampPan.DataBindings.Add("Value", dataGridView, "SelectedItem.pan"); NUDsampOffset.DataBindings.Add("Value", dataGridView, "SelectedItem.offset"); txtSampPath.DataBindings.Add("Text", dataGridView, "SelectedItem.path"); }
设置后,选中行变化时控件会自动更新值;用户修改控件值时,也会自动同步回_samplelist对应的对象。如果需要让数据绑定感知到对象属性的手动修改,你的Sample类需要实现INotifyPropertyChanged接口。
内容的提问来源于stack exchange,提问作者CocoaMix86
相关产品推荐
相关产品推荐

