我为我的DataGridView设置了一个ComboBoxColumn,并从枚举中设置了它的可选值 . 它主要按照我想要的方式运行,但有以下异常 .
每当我单击下拉箭头然后选择其中一个枚举值时,它仍然处于“中间”状态,其中未触发CellValueChanged事件 . 我需要专注于另一个单元格或另一个控件来触发事件 .
我还有一个DataGridView的Leaving事件的事件处理程序,它通过确保没有单元格为空来“验证”内容 .
因此,如果我创建一行并填充所有单元格并进入(当前为空白)ComboBox列,请将其更改为值,然后单击“运行”按钮;弹出我的错误对话框,因为ComboBox选择未“保存” .
我怎么能绕过这个?有没有办法在我从下拉列表中选择一个值后自动“设置”该值?
谢谢!
12 回答
我花了两个小时搜索错误,因为我没有注意到如果没有散焦,单元格值不会被保存,或者更好地说我只是注意到单元格没有散焦,因为组合框在保存时变白了( btn事件) . 不仅如此,EditOnEnter-Mode还可以解决上面显示的大多数其他方法的问题 . 使用EditOnEnter的原因是,当您使用DataGridViewComboBoxColumn时,如果未将EditMode设置为EditOnEnter,则必须单击两次才能打开下拉列表 .
this.dataGridView.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2; this.dataGridView.EndEdit(); this.dataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
我希望这有帮助 . 我花了大约两个小时想知道为什么对象中的值与GUI上显示的不一样 .
您应该使用
CurrentCellDirtyStateChanged
事件并强制在网格上进行提交编辑:希望能帮助到你!
我会通过在强制
CommitEdit
之前检查DataGridViewColumn
是否是DataGridViewComboBoxColumn
的类型来扩展ionden的答案 . 这将阻止其他DataGridViewColumn
对象过早提交 .CurrentCellDirtyStateChanged事件修复了此问题的鼠标交互,但它打破了键盘交互 - 使用F4然后向上/向下箭头,每次箭头单击都会导致脏状态更改并提交编辑 . 我找到的解决方案是在创建时抓取“DataGridViewComboBoxEditingControl”,并将DropDownClosed事件附加到它 . 这适用于键盘和鼠标交互 . 在这个例子中,我们扩展了DataGridView,因此每个实例都将继承此功能:
这就是我解决这个问题的方法
我会通过检查单元格类型而不是列类型来扩展Moop的答案 .
我将我的答案添加为已经发生的讨论的后续行动 . 我试图构建一个每行具有不同组合框的DataGridView . 他们还必须对单击进行响应 . 并且,当进行选择时,需要根据组合框选择来改变行中的另一个单元 . 一旦做出选择,就需要进行更改 . 我的主要问题,如OP,是在组合框失去焦点之前不会发生变化 .
所以,这是一个完整的工作最小的例子,这样一个DataGridView . 我不得不将其降低到最低限度,因为同时满足我的所有要求是非常棘手的 . 有几个SO帖子用于制作,我将在稍后更新我的帖子 . 但是现在,这里......
感谢Droj关于EndCurrentEdit的提示,我需要让它对我有用 . 这就是我最终做的就是立即提交DataGridViewComboBoxColumns和DataGridViewCheckBoxColumns:
您应该使用CellValueChanged来触发网格上的更改事件,并在事件内部提交更改并保留控件以便在选中项目后保存该项目 .
希望能帮助到你!
我看到的一个问题:如果你选择它将无法工作:
GridView.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
在某些情况下,在焦点完全离开行之前,该值不会粘住 . 在这种情况下,强制当前编辑结束的唯一方法是在整个绑定上下文中结束它:
我找到了这个提示here .