如何在同类别方法间传递动态创建的DataGridView(非类变量方式)
如何在同类方法间传递动态创建的DataGridView(除类变量外)
嘿,我懂你不想把DataGridView声明为类变量的想法,其实还有几种实用的方法能让你在btnManipulateGrid_Click里访问到那个动态创建的网格控件,我给你逐一说明:
方法1:通过控件名称递归查找
你已经给DataGridView设置了Name = "datagridviewonetwo",而且它被放在了名为pnladdedthroughcode的Panel里,你可以在点击方法中通过控件的名称层级来查找它:
private void btnManipulateGrid_Click(object sender, EventArgs e) { // 先找到承载网格的Panel var targetPanel = Controls.Find("pnladdedthroughcode", true).FirstOrDefault() as Panel; if (targetPanel != null) { // 再从Panel里找到DataGridView var datagridviewonetwo = targetPanel.Controls.Find("datagridviewonetwo", true).FirstOrDefault() as DataGridView; if (datagridviewonetwo != null) { // 现在可以正常使用网格了 var csvString = datagridviewonetwo.ForEachCell(wrapper => EscapeSpecialChars(wrapper, '&', '/')).ChangeRows(RemoveExtraData).ToCsvString(); } } }
注意:
Controls.Find的第二个参数true表示递归查找子控件,这样能确保找到嵌套在Panel里的网格。
方法2:利用按钮的Tag属性传递
在创建btnManipulateGrid的时候,把动态生成的DataGridView赋值给按钮的Tag属性,这样点击按钮时就能直接从sender对象里取出网格:
修改btnDynamicallyAddStuf_Click中绑定按钮的部分:
// 原来的代码后面加上这行 btnManipulateGrid.Tag = datagridviewonetwo; Controls.Add(btnManipulateGrid);
然后在点击方法中取出:
private void btnManipulateGrid_Click(object sender, EventArgs e) { var btn = sender as Button; if (btn != null) { var datagridviewonetwo = btn.Tag as DataGridView; if (datagridviewonetwo != null) { var csvString = datagridviewonetwo.ForEachCell(wrapper => EscapeSpecialChars(wrapper, '&', '/')).ChangeRows(RemoveExtraData).ToCsvString(); } } }
这种方法很直观,因为按钮本身就是触发操作的入口,把关联的网格直接绑定在按钮上,逻辑清晰。
方法3:使用闭包(匿名委托)绑定事件
在绑定按钮的Click事件时,直接用匿名方法捕获datagridviewonetwo变量,这样在事件处理逻辑里就能直接访问到它,不需要额外的传递步骤:
修改btnDynamicallyAddStuf_Click中的事件绑定代码:
// 替换原来的Click事件绑定 btnManipulateGrid.Click += (s, args) => { // 这里可以直接使用datagridviewonetwo,因为闭包捕获了这个变量 var csvString = datagridviewonetwo.ForEachCell(wrapper => EscapeSpecialChars(wrapper, '&', '/')).ChangeRows(RemoveExtraData).ToCsvString(); };
这种方式最简洁,不需要额外的查找或属性赋值,直接利用C#的闭包特性让事件处理方法访问到外层作用域的变量。
内容的提问来源于stack exchange,提问作者Smith Stanley
相关产品推荐
相关产品推荐

