在外部按钮单击时引用动态创建的datagridview对象

时间:2013-12-10 21:36:16

标签: c# button datagridview

所以我有一个导入Excel工作簿的C#应用​​程序。对于本书中的每个工作表,我在基本选项卡控件中动态创建一个新选项卡。每个选项卡都有一个拆分容器。顶部容器有一个按钮,底部有一个datagridview,用这个工作表的数据填充。每个控件的名称都使用工作表名称设置,前面带有控件类型的差异(即如果工作表名称为“User List”,则按钮名为“btnUserList”; DataGridView名为“dgvUserList”,等等等)。这一切都很有效!

外部按钮的目的是允许用户将他们在网格中选择的单元格范围导出到竖线分隔的文本文件。我的问题是我无法将按钮“绑定”到相关的DataGridView对象。

当我单击按钮时,我需要一些方法来引用相关的DataGridView,这样我就可以将它传递给我的函数,它获取所选的单元格范围数据。我试图将Button.Tag属性设置为DataGridView的名称,但由于这只是一个字符串,我实际上无法使用它来引用实际的DataGridView。

我一直在寻找这个问题的解决方案......这么多引用与嵌入式DataGridViewButtonColumn有关,但这种方法对我不起作用,所以我真的希望有人可以帮助我。谢谢!

所以这是一个示例按钮,请注意Tag的名称与为同一工作表动态创建DataGridView对象时使用的名称相同:

    private Button RunTimeCreatedButton;

    RunTimeCreatedButton.Name = "btnUserList";
    RunTimeCreatedButton.Tag = "dgvUserList"
    RunTimeCreatedButton.Click += new System.EventHandler(this.dynButton_Click);
    this.Controls.Add(RunTimeCreatedButton);

这是我的onclick事件:

    private void dynButton_Click(object sender, EventArgs e)
    {

        var button = (Button)sender;
        string theTag = button.Tag.ToString();

        // How do I get "theTag" to reference the actual DataGridView it is named after??

        // Send the DataGridView reference to the export method:
        exportRange(theTag);

    }

    private void exportRange(DataGridView dgv)
    {

        // This is where I need to start referencing the DataGridView
        Int32 selectedCellCount = dgv.GetCellCount(DataGridViewElementStates.Selected);
        ....do rest of stuff
    }

1 个答案:

答案 0 :(得分:0)

您可以通过它的名称访问DataGridView控件:

this.Controls[dgvName]

编辑:

您的控件层次结构非常复杂,所以这是您的摘要:

  • 您的表单包含TabControl
  • TabControl包含TabPages
  • TabPages包含SplitContainer
  • SplitContainer包含两个面板
  • Panel包含您的dataGridView

    private void exportRange(string dgvName)     {

        var tabPage = tabControlName.TabPages[tabName];
        var splitContainer = (SplitContainer)tabPage.Controls[ContainerName];
        var dgv = splitContainer.Panel1.Controls[dgvName];
    
    }