数据绑定:删除选中行后如何控制ComboBox的选中项
解决方案:手动控制ComboBox删除后的选中状态
这个场景我之前做WinForms项目时也遇到过,默认的绑定行为确实会在删除选中项后自动跳到最后一行,要改成你想要的效果其实很简单,核心就是在删除数据后手动覆盖ComboBox的选中状态,而且不用担心影响其他绑定该DataTable的控件——因为我们只针对ComboBox做单独处理,不会修改DataTable本身的事件逻辑。
下面给你两种符合需求的实现方式:
方式一:删除后自动选中第一行(x)
如果希望删除y行后,默认选中剩下的第一行x(如果还有数据的话),可以在删除代码之后手动设置SelectedIndex:
// 先获取当前ComboBox选中的行(要删除的y行) DataRow selectedRow = (DataRow)yourComboBox.SelectedItem; // 从DataTable中移除该行 yourDataTable.Rows.Remove(selectedRow); // 手动设置ComboBox选中第一行 if (yourDataTable.Rows.Count > 0) { yourComboBox.SelectedIndex = 0; } else { // 如果DataTable空了,就设置为无选中项 yourComboBox.SelectedIndex = -1; }
方式二:删除后不选中任何项
要是更倾向于删除后ComboBox保持无选中状态(不管DataTable还有没有数据),直接把SelectedIndex设为-1就行:
DataRow selectedRow = (DataRow)yourComboBox.SelectedItem; yourDataTable.Rows.Remove(selectedRow); // 设置为无选中项 yourComboBox.SelectedIndex = -1;
为什么默认会选中最后一行?
当ComboBox绑定DataTable时,若当前选中的数据源项被删除,控件会自动选中数据源的最后一项,这是.NET WinForms绑定的默认行为。我们上面的代码就是在删除操作完成后,立刻覆盖这个默认选中逻辑,达到你想要的效果。
关于其他绑定控件的注意事项
因为你不确定还有哪些控件在用这个DataTable,所以不要去修改DataTable的RowDeleted之类的全局事件——那样会影响所有绑定该表的控件。我们上面的方案只在删除代码后针对ComboBox单独设置选中状态,完全不会干扰其他控件的正常工作。
内容的提问来源于stack exchange,提问作者NewHorse
相关产品推荐
相关产品推荐

