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

如何通过名称访问TabControl中Tab页对应的DataGridView?

问题:通过Tab页名称获取对应DataGridView

我有一个向TabControl添加Tab页并在其中创建DataGridView的方法:

public void dgv_AddGrid(string dgvName)
{
    int tabCount = tabControl1.TabCount;
    listBox1.Items.Add(tabCount.ToString());
    Application.DoEvents();
    tabControl1.TabPages.Insert(0, dgvName);
    tabControl1.SelectedTab = tabControl1.TabPages[0];
    tabControl1.SelectedTab.Name = dgvName;
    DataGridView grid = new DataGridView();
    tabControl1.TabPages[0].Controls.Add(grid);
    grid.ColumnCount = 3;
    grid.Width = tabControl1.Width;
    grid.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
    dgv = grid;     // 将全局变量设置为新创建的DataGridView
}

创建多组Tab页和DataGridView后,我需要通过dgvName访问对应的Tab页和DataGridView组合,尝试了以下方法但无法成功获取选中Tab页上的DataGridView:

public void dgv_SelectTab_Grid_By_Name(string tabName)
{
    if (tabControl1.TabPages[tabName] == null)
    {
        MessageBox.Show("请求的Tab/Data Grid组合不存在。\r\n当前选中的Tab/Data Grid组合保持不变!",
                        "Tab不存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    else
    {
        tabControl1.SelectedTab = tabControl1.TabPages[tabName];
        dgv = tabControl1.SelectedTab.grid; // 此处无法获取grid对象
    }
}

全局变量为DataGridView dgv,使用.NET Framework 4.6.2以兼容Win10。


解决方案

方法1:给DataGridView设置同名Name属性,通过Controls查找

在创建DataGridView时,给它设置与Tab页一致的Name属性,之后就可以通过Tab页的Controls集合直接定位:

修改dgv_AddGrid方法,添加grid.Name = dgvName;:

public void dgv_AddGrid(string dgvName)
{
    int tabCount = tabControl1.TabCount;
    listBox1.Items.Add(tabCount.ToString());
    Application.DoEvents();
    tabControl1.TabPages.Insert(0, dgvName);
    tabControl1.SelectedTab = tabControl1.TabPages[0];
    tabControl1.SelectedTab.Name = dgvName;
    DataGridView grid = new DataGridView();
    grid.Name = dgvName; // 给DataGridView设置与Tab页同名的Name
    tabControl1.TabPages[0].Controls.Add(grid);
    grid.ColumnCount = 3;
    grid.Width = tabControl1.Width;
    grid.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
    dgv = grid;
}

修改dgv_SelectTab_Grid_By_Name方法:

public void dgv_SelectTab_Grid_By_Name(string tabName)
{
    var targetTab = tabControl1.TabPages[tabName];
    if (targetTab == null)
    {
        MessageBox.Show("请求的Tab/Data Grid组合不存在。\r\n当前选中的Tab/Data Grid组合保持不变!",
                        "Tab不存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    tabControl1.SelectedTab = targetTab;
    // 通过Name直接查找DataGridView
    dgv = targetTab.Controls[tabName] as DataGridView;
}

方法2:用字典存储Tab名称与DataGridView的映射

提前定义一个全局字典,在创建Tab和DataGridView时记录对应关系,后续直接通过字典获取:

先添加全局字典定义:

private Dictionary<string, DataGridView> _tabGridMap = new Dictionary<string, DataGridView>();

修改dgv_AddGrid方法,添加映射关系:

public void dgv_AddGrid(string dgvName)
{
    int tabCount = tabControl1.TabCount;
    listBox1.Items.Add(tabCount.ToString());
    Application.DoEvents();
    tabControl1.TabPages.Insert(0, dgvName);
    tabControl1.SelectedTab = tabControl1.TabPages[0];
    tabControl1.SelectedTab.Name = dgvName;
    DataGridView grid = new DataGridView();
    tabControl1.TabPages[0].Controls.Add(grid);
    grid.ColumnCount = 3;
    grid.Width = tabControl1.Width;
    grid.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
    dgv = grid;
    // 将Tab名称与DataGridView存入字典
    _tabGridMap[dgvName] = grid;
}

修改dgv_SelectTab_Grid_By_Name方法:

public void dgv_SelectTab_Grid_By_Name(string tabName)
{
    var targetTab = tabControl1.TabPages[tabName];
    if (targetTab == null || !_tabGridMap.ContainsKey(tabName))
    {
        MessageBox.Show("请求的Tab/Data Grid组合不存在。\r\n当前选中的Tab/Data Grid组合保持不变!",
                        "Tab不存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    tabControl1.SelectedTab = targetTab;
    // 直接从字典中获取对应DataGridView
    dgv = _tabGridMap[tabName];
}

方法3:遍历Tab页控件查找DataGridView类型

如果不想设置Name属性或使用字典,可以遍历Tab页的Controls集合,筛选出DataGridView类型的控件:

修改dgv_SelectTab_Grid_By_Name方法(需引用System.Linq命名空间):

public void dgv_SelectTab_Grid_By_Name(string tabName)
{
    var targetTab = tabControl1.TabPages[tabName];
    if (targetTab == null)
    {
        MessageBox.Show("请求的Tab/Data Grid组合不存在。\r\n当前选中的Tab/Data Grid组合保持不变!",
                        "Tab不存在", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    tabControl1.SelectedTab = targetTab;
    // 遍历控件集合,找到第一个DataGridView
    dgv = targetTab.Controls.OfType<DataGridView>().FirstOrDefault();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:59:52