You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑绑定TextBox时内容变更无法即时同步到DataGridView问题求解

问题根源说明

你遇到的两个核心问题的原因是:

  1. TextBox默认的数据绑定更新触发时机为OnValidation,只有控件失去焦点时才会将修改推送到绑定数据源,因此未切换行时DataGridView无法获取最新值。
  2. 直接在TextChanged事件中调用EndEdit会触发绑定回写逻辑,数据源更新后会重新赋值TextBox的Text属性,导致光标重置到内容开头。

可行解决方案

方案1(推荐,无侵入)

步骤1:调整TextBox绑定的更新模式

给TextBox绑定Text属性时,显式指定更新模式为DataSourceUpdateMode.OnPropertyChanged,即可实现TextBox内容变化时自动推送到数据源,无需手动触发提交。
代码示例:

// 参数说明:绑定属性名、绑定源、目标字段名、是否开启格式化、更新模式
textBox1.DataBindings.Add("Text", bindingsource1, "你要绑定的DataTable字段名", true, DataSourceUpdateMode.OnPropertyChanged);

如果是设计器中添加的绑定,可以在属性窗口的「数据」-「(DataBindings)」-「高级」设置中,将UpdateMode修改为OnPropertyChanged。

步骤2:可选补充刷新逻辑

如果调整绑定模式后DataGridView仍未实时刷新,给BindingSource添加ListChanged事件处理即可:

private void bindingsource1_ListChanged(object sender, ListChangedEventArgs e)
{
    // 仅字段值变更时刷新DataGridView,减少不必要的性能损耗
    if (e.ListChangedType == ListChangedType.ItemChanged)
    {
        datagridview1.Refresh();
    }
}

方案2(兼容原有逻辑,彻底解决光标跳转)

如果你需要保留原有调用EndEdit的逻辑,可以在触发提交前后手动保存、恢复光标位置:

private void Textbox1_TextChanged(object sender, EventArgs e)
{
    // 保存当前光标位置和选中长度
    int cursorPos = textBox1.SelectionStart;
    int selectLen = textBox1.SelectionLength;

    // 执行原有提交逻辑
    bindingsource1.EndEdit();

    // 恢复光标状态
    textBox1.SelectionStart = cursorPos;
    textBox1.SelectionLength = selectLen;
}

内容的提问来源于stack exchange,提问作者lolikols

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:39:03