如何通过名称访问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
相关产品推荐
相关产品推荐

