VB.NET实现DataGridView指定列数据拆分复制至另一DataGridView求助
解决方案
原代码存在的问题
- 未对"range"列数据执行拆分操作,只是直接复制整列值
- 逻辑混乱:遍历行时找到第一个值为"I"的行就添加列,随后重复插入所有行的cells(5)值,完全不符合拆分需求
- 列初始化和添加的时机错误,可能导致重复列或列配置异常
修正后的代码(以"range"列内容用逗号分隔为例)
' 先清空DataGridView2的内容,避免残留旧数据 DataGridView2.Rows.Clear() DataGridView2.Columns.Clear() ' 给DataGridView2添加必要的列,比如保留原行的标识列+拆分后的range列 Dim idCol As New DataGridViewTextBoxColumn() With { .HeaderText = "原行ID", .AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, .ReadOnly = True } Dim splitRangeCol As New DataGridViewTextBoxColumn() With { .HeaderText = "拆分后Range", .AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells, .ReadOnly = True } DataGridView2.Columns.Add(idCol) DataGridView2.Columns.Add(splitRangeCol) ' 遍历DataGridView1的每一行 For Each row As DataGridViewRow In DataGridView1.Rows ' 跳过空行 If row.IsNewRow Then Continue For ' 获取"range"列的值(替换为你实际的列索引或列名) Dim rangeValue As String = row.Cells(DataGridView1.Columns("range").Index).Value?.ToString() If String.IsNullOrEmpty(rangeValue) Then Continue For ' 拆分range值(这里用逗号作为分隔符,可根据实际情况替换为"-"、";"等) Dim splitValues As String() = rangeValue.Split(New String() {","}, StringSplitOptions.RemoveEmptyEntries) ' 将每个拆分后的值添加到DataGridView2 For Each val As String In splitValues ' 可添加原行的其他关联数据,比如原行第一列值作为标识 DataGridView2.Rows.Add(row.Cells(0).Value?.ToString(), val.Trim()) Next Next
代码说明
- 先清空dgv2的列和行,确保从干净状态开始
- 按需创建dgv2的列,示例添加了原行标识列和拆分后的range列,可根据需求调整列数量和配置
- 遍历dgv1的每一行,跳过空行和无值的单元格
- 使用
Split方法拆分"range"列内容,StringSplitOptions.RemoveEmptyEntries可去掉拆分后产生的空字符串 - 循环将每个拆分后的值添加到dgv2的新行中,同时可关联原行的其他数据
如果你的"range"列是类似1-5的连续范围格式,需要生成1、2、3、4、5这类值,可替换拆分部分的代码为:
' 处理范围格式(如"1-5") If rangeValue.Contains("-") Then Dim parts As String() = rangeValue.Split("-") If parts.Length = 2 Then Dim startNum As Integer, endNum As Integer If Integer.TryParse(parts(0).Trim(), startNum) AndAlso Integer.TryParse(parts(1).Trim(), endNum) Then For num As Integer = startNum To endNum DataGridView2.Rows.Add(row.Cells(0).Value?.ToString(), num.ToString()) Next End If End If Else ' 非范围格式直接添加 DataGridView2.Rows.Add(row.Cells(0).Value?.ToString(), rangeValue.Trim()) End If
内容的提问来源于stack exchange,提问作者Lina Tan
相关产品推荐
相关产品推荐

