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

求C#实现自定义DataGridView内嵌TextBox及绑定相关事件的代码

自定义DataGridView内嵌TextBox并绑定事件实现

要在自定义DataGridView中内嵌TextBox并绑定指定事件,推荐通过自定义DataGridView列和单元格的方式实现,这样能保证控件的可复用性,同时兼容原生DataGridView的交互逻辑。以下是完整的C#实现代码:

using System.Windows.Forms;

public partial class CustomDataGridView : DataGridView
{
    public CustomDataGridView()
    {
        InitializeComponent();
        // 默认添加自定义TextBox列,也可在设计时手动添加
        this.Columns.Add(new CustomTextBoxColumn());
    }

    // 自定义TextBox列
    public class CustomTextBoxColumn : DataGridViewColumn
    {
        public CustomTextBoxColumn() : base(new CustomTextBoxCell())
        {
        }
    }

    // 自定义TextBox单元格
    public class CustomTextBoxCell : DataGridViewTextBoxCell
    {
        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            
            // 获取当前编辑控件(即内嵌的TextBox)
            if (this.DataGridView.EditingControl is TextBox txtBox)
            {
                // 先移除原有绑定,避免重复触发事件
                txtBox.TextChanged -= TxtBox_TextChanged;
                txtBox.Enter -= TxtBox_Enter;
                txtBox.KeyDown -= TxtBox_KeyDown;

                // 重新绑定目标事件
                txtBox.TextChanged += TxtBox_TextChanged;
                txtBox.Enter += TxtBox_Enter;
                txtBox.KeyDown += TxtBox_KeyDown;
            }
        }

        // TextChanged事件处理逻辑
        private void TxtBox_TextChanged(object sender, System.EventArgs e)
        {
            if (sender is TextBox txtBox)
            {
                // 示例:同步文本到单元格值,可替换为自定义业务逻辑
                this.Value = txtBox.Text;
            }
        }

        // Enter事件处理逻辑
        private void TxtBox_Enter(object sender, System.EventArgs e)
        {
            if (sender is TextBox txtBox)
            {
                // 示例:进入编辑时选中全部文本,可替换为自定义业务逻辑
                txtBox.SelectAll();
            }
        }

        // KeyDown事件处理逻辑
        private void TxtBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (sender is TextBox txtBox)
            {
                // 示例:按下Enter键结束编辑,可替换为自定义业务逻辑
                if (e.KeyCode == Keys.Enter)
                {
                    this.DataGridView.EndEdit();
                }
            }
        }

        // 指定单元格使用的编辑控件类型
        public override Type EditType => typeof(TextBox);
    }
}

关键说明

  • 自定义列与单元格:通过继承DataGridViewColumn和DataGridViewTextBoxCell,实现对TextBox控件的完全控制,保证控件复用性。
  • 事件绑定逻辑:在InitializeEditingControl方法中完成事件绑定,先移除原有绑定可避免单元格重复编辑时事件多次触发。
  • 业务扩展:三个事件的处理方法中,可根据需求替换为自定义业务代码,比如文本格式校验、快捷键响应等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:30:14