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

C#:如何为动态创建的DataGridView添加CellDoubleClick事件?

解决动态DataGridView双击事件绑定与Panel关闭问题

你遇到的核心问题是:拖拽生成的事件方法不会自动关联到动态创建的控件,必须手动给动态生成的DataGridView绑定事件委托,同时还要在事件里处理Panel的隐藏/移除逻辑。

具体修改步骤:

  1. 手动绑定CellDoubleClick事件
    在动态创建dgvSupp的代码段末尾,添加事件绑定代码,把你的事件方法和控件关联起来:

    dgvSupp = new DataGridView();
    // ... 其他dgvSupp的属性设置代码 ...
    // 新增:绑定双击事件
    dgvSupp.CellDoubleClick += dgvSupp_CellDoubleClick;
    
  2. 完善事件处理方法
    修改你的dgvSupp_CellDoubleClick方法,加上行索引有效性判断,以及获取并关闭Panel的逻辑:

    private void dgvSupp_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        // 过滤点击表头的无效操作(此时e.RowIndex为-1)
        if (e.RowIndex < 0) return;
    
        // 从sender获取当前触发事件的DataGridView(比直接用全局变量更可靠)
        DataGridView currentDgv = sender as DataGridView;
        DataGridViewRow selectedRow = currentDgv.Rows[e.RowIndex];
    
        // 赋值供应商ID到文本框
        txtID.Text = selectedRow.Cells["Supplier ID"].Value.ToString();
    
        // 获取父Panel并移除/隐藏
        Panel parentPanel = currentDgv.Parent as Panel;
        if (parentPanel != null)
        {
            // 选择1:直接移除Panel并释放资源(彻底关闭)
            this.Controls.Remove(parentPanel);
            parentPanel.Dispose();
    
            // 选择2:仅隐藏Panel(后续可再次显示)
            // parentPanel.Visible = false;
        }
    }
    

修改后的完整创建代码参考:

DataGridView dgvSupp;

private void cbSuppID_Click(object sender, EventArgs e)
{
   pGeneral.Controls.RemoveByKey("pCatHierarchy");
   Panel pSupp = new Panel();
   pSupp.Size = new System.Drawing.Size(239, 196);
   pSupp.Location = new Point(152, 173);
   pSupp.Name = "pSupplier";
   pSupp.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
   this.Controls.Add(pSupp);
   pSupp.BringToFront();

   dgvSupp = new DataGridView();
   dgvSupp.AllowUserToAddRows = false;
   dgvSupp.AllowUserToDeleteRows = false;
   dgvSupp.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
   dgvSupp.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
   dgvSupp.Dock = System.Windows.Forms.DockStyle.Fill;
   dgvSupp.MultiSelect = false;
   dgvSupp.ReadOnly = true;
   dgvSupp.RowHeadersVisible = false;
   dgvSupp.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
   // 新增:绑定双击事件
   dgvSupp.CellDoubleClick += dgvSupp_CellDoubleClick;

   pSupp.Controls.Clear();
   pSupp.Controls.Add(dgvSupp);

   DataTable dt = pc.fetchRecord("VIEW", "FETCHCBSUPP", "", "", "", "", "", "");
   BindingSource source = new BindingSource();
   source.DataSource = dt;
   dgvSupp.DataSource = source;
}

关键说明:

  • 用sender获取当前DataGridView比直接依赖全局变量dgvSupp更可靠,避免多次创建控件时引用混乱。
  • 判断e.RowIndex >= 0可以防止点击表头时出现索引越界错误。
  • 通过currentDgv.Parent直接获取父Panel,不用额外保存Panel的引用,简化代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:13:21