VB.NET中如何通过DataTable将TextBox内容拆分至多列DataGridView
VB.NET:TextBox内容拆分到DataGridView多列问题修正
问题说明
在VB.NET中,尝试将单个TextBox中的内容拆分后存入DataTable,再绑定到多列DataGridView中。已实现基于TextBox事件的二维码扫描功能,但运行代码后未得到预期结果,具体如下:
示例输入数据
TextBox输入内容:A,B,C,D,E,F,G,H,I
当前错误结果
| NO | Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 |
|---|---|---|---|---|---|
| 1 | System.String[] | System.String[] | System.String[] | System.String[] | System.String[] |
期望结果
| NO | Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 |
|---|---|---|---|---|---|
| 1 | A | B | D | G | I |
原代码
Public Class Form2 Public testtable As New DataTable() Protected Overrides Sub OnLoad(e As EventArgs) MyBase.OnLoad(e) testtable.Columns.AddRange({ New DataColumn("No", GetType(Integer)), New DataColumn("Criteria1", GetType(String)), New DataColumn("Criteria2", GetType(String)), New DataColumn("Criteria3", GetType(String)), New DataColumn("Criteria4", GetType(String)), New DataColumn("Criteria5", GetType(String))}) End Sub Private Sub parseBarcodeScan(input As String) Dim split = input.Split({","}, StringSplitOptions.RemoveEmptyEntries).Select(Function(s) s.Trim()) End Sub Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = Chr(13) Then parseBarcodeScan(TextBox1.Text) Try testtable.Rows.Add(testtable.Rows.Count + 1, Split(0), Split(1), Split(3), Split(6), Split(8)) DataGridView1.DataSource = testtable TextBox1.Clear() Catch ex As Exception MessageBox.Show(ex.Message) End Try End If End Sub End Class
问题排查
- 局部变量作用域问题:
parseBarcodeScan方法中的split是局部变量,外部无法访问,导致后续代码中调用的Split是VB内置的Split函数,而非拆分后的数组。 - 未转换为数组:使用
Select后得到的是IEnumerable(Of String),直接索引访问会有问题,需转换为字符串数组。 - 索引越界风险:未判断拆分后的数组长度,若输入数据不足会抛出异常。
修正后的代码
Public Class Form2 Public testtable As New DataTable() Protected Overrides Sub OnLoad(e As EventArgs) MyBase.OnLoad(e) testtable.Columns.AddRange({ New DataColumn("No", GetType(Integer)), New DataColumn("Criteria1", GetType(String)), New DataColumn("Criteria2", GetType(String)), New DataColumn("Criteria3", GetType(String)), New DataColumn("Criteria4", GetType(String)), New DataColumn("Criteria5", GetType(String))}) ' 初始化DataGridView绑定 DataGridView1.DataSource = testtable End Sub ' 修改方法返回拆分后的数组 Private Function parseBarcodeScan(input As String) As String() ' 拆分后转数组并去除空项和首尾空格 Return input.Split({","}, StringSplitOptions.RemoveEmptyEntries).Select(Function(s) s.Trim()).ToArray() End Sub Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress If e.KeyChar = Chr(13) Then Dim splitArray = parseBarcodeScan(TextBox1.Text) Try ' 检查数组长度是否满足所需索引,避免越界 If splitArray.Length >= 9 Then testtable.Rows.Add(testtable.Rows.Count + 1, splitArray(0), splitArray(1), splitArray(3), splitArray(6), splitArray(8)) Else MessageBox.Show("输入数据格式不正确,缺少必要项!") End If TextBox1.Clear() Catch ex As Exception MessageBox.Show("错误:" & ex.Message) End Try End If End Sub End Class
关键修改点
- 将
parseBarcodeScan改为返回字符串数组,让外部能获取拆分后的数据。 - 拆分后调用
.ToArray()转换为数组,确保可以通过索引访问元素。 - 添加数组长度检查,避免因输入数据不完整导致的索引越界异常。
- 提前在
OnLoad中绑定DataGridView数据源,无需每次添加行都重新绑定。
内容的提问来源于stack exchange,提问作者user22579796
相关产品推荐
相关产品推荐

