VB.NET技术问询:如何将TextBox的值传入DataGridView(含代码片段)
实现TextBox值传入DataGridView的VB.NET方案验证与优化
看起来你这段代码的核心思路是对的——在文本框失去焦点时,把多个输入框的值新增到DataGridView里,但咱们得先把几个细节捋清楚,再给你一个更健壮的实现方案。
现有代码的有效性分析
你的代码片段逻辑没问题,TxtList.Rows.Add()会新增一行并返回行索引,通过列名给单元格赋值的方式也是VB.NET操作DataGridView的标准写法。但有几个明显的问题需要修正:
- 代码被截断了:
stAmoun...部分没写完,这会直接导致编译错误,得补全对应的赋值语句(比如TxtList.Item("stAmount", nR).Value = txtAmount.Text) - 缺少输入验证:如果用户没填某些TextBox就触发Leave事件,会把空值存入DataGridView,可能不符合业务需求
- 没有清空输入框:新增行后输入框还保留之前的值,容易导致重复添加相同内容
- 未处理列不存在的异常:如果
stsno、stAcctCode这些列名拼写错误或未预先定义,会抛出运行时异常
规范的实现方案
下面是完善后的代码,包含输入验证、空值处理、异常捕获和用户体验优化:
Private Sub txtDrCr_Leave(sender As Object, e As EventArgs) Handles txtDrCr.Leave ' 先验证关键输入项是否为空(可根据业务需求调整必填项) If String.IsNullOrWhiteSpace(txtAccountCode.Text) OrElse String.IsNullOrWhiteSpace(txtAccountName.Text) OrElse String.IsNullOrWhiteSpace(txtAmount.Text) Then MessageBox.Show("请填写所有必填字段!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning) txtAccountCode.Focus() ' 让焦点回到未填的输入框 Return End If Try ' 新增一行并获取行索引 Dim newRowIndex As Integer = TxtList.Rows.Add() Dim newRow As DataGridViewRow = TxtList.Rows(newRowIndex) ' 给各列赋值,同时处理空值(如果是数值类型需做类型转换) newRow.Cells("stsno").Value = newRowIndex + 1 ' 自动生成序号 newRow.Cells("stAcctCode").Value = If(String.IsNullOrWhiteSpace(txtAccountCode.Text), DBNull.Value, txtAccountCode.Text) newRow.Cells("stAcctName").Value = If(String.IsNullOrWhiteSpace(txtAccountName.Text), DBNull.Value, txtAccountName.Text) newRow.Cells("stBranch").Value = If(String.IsNullOrWhiteSpace(txtBranchName.Text), DBNull.Value, txtBranchName.Text) newRow.Cells("stDescription").Value = If(String.IsNullOrWhiteSpace(txtDescription.Text), DBNull.Value, txtDescription.Text) ' 如果金额是数值类型,要做转换并处理格式错误 If Decimal.TryParse(txtAmount.Text, Nothing) Then newRow.Cells("stAmount").Value = Convert.ToDecimal(txtAmount.Text) Else MessageBox.Show("请输入有效的金额数值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning) TxtList.Rows.RemoveAt(newRowIndex) ' 删除新增的空行 txtAmount.Focus() Return End If ' 清空所有输入框,方便下一次输入 ClearInputTextBoxes() Catch ex As Exception MessageBox.Show($"添加行失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub ' 封装清空输入框的方法,提高代码复用性 Private Sub ClearInputTextBoxes() txtAccountCode.Clear() txtAccountName.Clear() txtBranchName.Clear() txtDescription.Clear() txtAmount.Clear() txtDrCr.Focus() ' 焦点回到触发控件,方便继续操作 End Sub
额外的优化建议
- 提前定义DataGridView列:确保
stsno、stAcctCode等列已经在设计时添加,或者通过代码动态创建,避免列名错误 - 用BindingSource作为中间层:如果后续需要对数据进行修改、删除、保存到数据库等操作,建议用BindingSource绑定DataGridView,代码会更简洁易维护
- 限制重复触发:如果用户快速切换焦点,可能会重复触发Leave事件,可以添加一个布尔标志位防止重复执行
内容的提问来源于stack exchange,提问作者Ali.hassan
相关产品推荐
相关产品推荐

