WinForm中如何获取多层嵌套TabControl下DataGridView的内容?
WinForm多层TabControl下DataGridView数据获取方案
原代码存在的问题
你的循环逻辑有两个明显的问题:
- 第二层循环遍历
tbp.Controls得到的item可能不是TabControl,直接遍历item.Controls并强制转为TabPage会触发类型转换错误 - 最内层循环得到的
dgv是Control类型,没有判断它是否真的是DataGridView,可能会处理到其他控件
修正后的遍历代码
先做类型判断,确保只处理目标控件:
foreach (TabPage mainTabPage in tabControl_X.TabPages) { // 找到当前主TabPage里的TabControl var subTabControl = mainTabPage.Controls.OfType<TabControl>().FirstOrDefault(); if (subTabControl == null) continue; foreach (TabPage subTabPage in subTabControl.TabPages) { // 找到当前子TabPage里的DataGridView var dgv = subTabPage.Controls.OfType<DataGridView>().FirstOrDefault(); if (dgv == null) continue; // 在这里处理DataGridView的数据 GetDgvData(dgv); } }
获取DataGridView数据的两种常用方式
方式1:直接遍历行和单元格(适用于未绑定数据源的情况)
void GetDgvData(DataGridView dgv) { // 遍历每一行 foreach (DataGridViewRow row in dgv.Rows) { // 跳过新行(如果允许用户添加行) if (row.IsNewRow) continue; // 遍历该行的每个单元格 foreach (DataGridViewCell cell in row.Cells) { // 获取单元格值,注意处理空值 var cellValue = cell.Value ?? string.Empty; // 这里可以根据需求存储或处理cellValue Console.WriteLine($"单元格值:{cellValue}"); } } }
方式2:直接获取绑定的数据源(适用于已绑定DataTable/BindingSource的情况)
如果你的DataGridView是绑定了DataTable或BindingSource,可以直接取数据源,效率更高:
void GetDgvData(DataGridView dgv) { // 情况1:绑定的是DataTable if (dgv.DataSource is DataTable dt) { // 直接操作DataTable,比如转成List或遍历行 foreach (DataRow dr in dt.Rows) { var column1Value = dr["ColumnName1"] ?? string.Empty; var column2Value = dr["ColumnName2"] ?? string.Empty; // 处理数据 } } // 情况2:绑定的是BindingSource else if (dgv.DataSource is BindingSource bs && bs.DataSource is DataTable dt2) { foreach (DataRow dr in dt2.Rows) { // 同样处理数据 } } }
内容的提问来源于stack exchange,提问作者Headshot
相关产品推荐
相关产品推荐

