【问题标题】:Update DataGridView DataSource Immediately When TextBox Value Changed当 TextBox 值更改时立即更新 DataGridView 数据源
【发布时间】:2011-06-27 11:03:03
【问题描述】:

我有一个简单的 DataGridView,它绑定到一个业务对象列表(每个对象只有一个可编辑字段)。我需要用户对值(在 DataGridViewTextBoxColumn 中)进行的任何更改来更新绑定的对象。也就是说,以与绑定普通文本框并使用“OnPropertyChanged”选项时可用的相同方式对每个按键进行更新。

这样做的原因是当绑定对象的“IsDirty”属性为真时,我只需要启用表单上的“确定”按钮。

在各个网站上似乎有很多关于对复选框列执行此操作以及使用 CurrentCellDirtyStateChanged 事件和调用 CommitEdit 的讨论。我已经尝试过了,但这有一个不幸的副作用,即在第一次按键时清除所有文本的单元格!

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 您真的需要更新数据源吗?难道你不能简单地使用 CurrentCellDirtyStateChanged 事件并启用按钮吗?当单击按钮时失去焦点时,数据源应更新。

标签: datagridview


【解决方案1】:

听起来您想要在用户开始在任何单元格中输入时启用按钮? DataSource真的需要在点击按钮之前更新吗?

如果不是,那么 CurrentCellDirtyStateChanged 应该可以正常工作 - 只是不要调用 CommitEdit 方法,而是在此处设置您的按钮启用。

当单元格失去焦点时,更改将应用​​于DataSource - 因此当单击按钮时,您将能够处理正确的数据。


我想我可能已经找到了一个解决方案 - 不是 100% 肯定,因为我没有 MVC 控制器,你必须连接 IsDirty 更改并查看它的全部工作 - 我确实在属性设置器中设置了一个断点我的 DataSource 对象,它被以下代码触发,而不是没有它,所以我认为这是可行的。

它只是将 CurrentCellDirtyStateChanged 和 CurrentCellChange 枚举用于 DataErrorContext 参数。

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange);
}

【讨论】:

  • 这是我想要的效果,是的,但我有一个模型-视图-控制器 (MVC) 架构,因此必须在对象中完成工作。当对象脏时启用按钮,而不是直接通过表单上的代码。
  • 我发现在尝试获取 MV* 架构(我将 MVP 用于 winforms)时,数据绑定会成为障碍。
  • @Darren - 另外,关于架构的想法,除非您要进行非常严格的被动视图,否则您不能从 CurrentCellDirtyStateChanged 事件向您的控制器发送消息,然后进行必要的更改到视图 - 数据绑定不一定需要进入它。
  • 我可能不得不使用类似的东西(可能是'MarkEditingStarted'方法和'HasEditingStarted'标志,但按钮是否启用的逻辑是列表中的对象是否脏。那逻辑简单正确,我想保持这样。
  • 这类似于我在原始问题中提到的代码(传递了不同的参数),导致文本在 CommitEdit 过程中以某种方式被清除。具有不同参数的代码具有相同的效果。我正在尝试单步调试 DataGridView 源代码,看看我是否可以确切地看到它是如何发生的,但正如您可以想象的那样,要看到发生了什么并不容易。
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2013-10-11
相关资源
最近更新 更多