无需ASP:如何通过事件获取控件以复用DataGridView函数库
问题解决:CS1503类型转换错误与DataGridView通用函数库实现
核心问题原因
你遇到的CS1503错误是因为FindControlByName返回的是Control基类对象,而dgv_RowDelete需要的是DataGridView派生类对象,C#不允许隐式将基类转换为派生类,必须显式转换。
最优解决方案(无需冗余查找)
事件触发时的sender本身就是触发事件的DataGridView控件,完全不需要通过父控件查找,直接转换即可:
private void dgvSignals_MouseClick(object sender, MouseEventArgs e) { // 直接将sender转换为DataGridView,这就是触发事件的目标控件 DataGridView dgv = sender as DataGridView; if (dgv != null) { lstDebug.Items.Add("Control Name: " + dgv.Name); lstDebug.Items.Add("Control Type: " + dgv.GetType()); // 直接调用通用函数,类型完全匹配 dgv_RowDelete(dgv, 6); } } private bool dgv_RowDelete(DataGridView dgv, int row2Remove) { // 实现行删除逻辑 if (dgv == null || row2Remove < 0 || row2Remove >= dgv.Rows.Count) return false; // 分绑定数据源和非绑定两种情况处理 if (dgv.DataSource != null) { DataTable dt = dgv.DataSource as DataTable; if (dt != null) { dt.Rows[row2Remove].Delete(); dt.AcceptChanges(); return true; } } else { dgv.Rows.RemoveAt(row2Remove); return true; } return false; }
如果你坚持使用原查找逻辑(不推荐)
如果一定要保留通过父控件查找的方式,需要将找到的Control显式转换为DataGridView:
// 在你的原有代码中,找到A后添加转换逻辑 if (A != null) { lstDebug.Items.Add("A.Name: " + A.Name); lstDebug.Items.Add("A.Type: " + A.GetType()); // 安全转换:用as关键字,转换失败返回null,不会抛出异常 DataGridView targetDgv = A as DataGridView; if (targetDgv != null) { dgv_RowDelete(targetDgv, 6); } }
通用函数库复用建议
为了实现可直接复制复用的函数库,遵循以下规则:
- 所有通用函数的第一个参数都定义为
DataGridView dgv - 在任何
DataGridView的事件中,直接将sender转换为DataGridView后传入函数 - 避免在函数内部硬编码控件名称,完全依赖参数传递
示例通用函数扩展:
// 清空DataGridView private void dgv_Clear(DataGridView dgv) { if (dgv == null) return; dgv.Rows.Clear(); if (dgv.DataSource == null) dgv.Columns.Clear(); } // 设置列自适应宽度 private void dgv_AutoSizeColumns(DataGridView dgv) { if (dgv == null) return; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; }
内容的提问来源于stack exchange,提问作者Mike Sr
相关产品推荐
相关产品推荐

