C#:如何为动态创建的DataGridView添加CellDoubleClick事件?
解决动态DataGridView双击事件绑定与Panel关闭问题
你遇到的核心问题是:拖拽生成的事件方法不会自动关联到动态创建的控件,必须手动给动态生成的DataGridView绑定事件委托,同时还要在事件里处理Panel的隐藏/移除逻辑。
具体修改步骤:
手动绑定CellDoubleClick事件
在动态创建dgvSupp的代码段末尾,添加事件绑定代码,把你的事件方法和控件关联起来:dgvSupp = new DataGridView(); // ... 其他dgvSupp的属性设置代码 ... // 新增:绑定双击事件 dgvSupp.CellDoubleClick += dgvSupp_CellDoubleClick;完善事件处理方法
修改你的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
相关产品推荐
相关产品推荐

