编辑绑定TextBox时内容变更无法即时同步到DataGridView问题求解
问题根源说明
你遇到的两个核心问题的原因是:
- TextBox默认的数据绑定更新触发时机为
OnValidation,只有控件失去焦点时才会将修改推送到绑定数据源,因此未切换行时DataGridView无法获取最新值。 - 直接在
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
相关产品推荐
相关产品推荐

