我在我的 VB.Net 程序中使用相同的技术在 custom TextBox 上添加 MAX-STRING-LENGTH 约束。
我使用 SQL SELECT 命令获取 4 列的值
SELECT code_pays
,nom
,code_pays_short
,default_devise
FROM pays
ORDER BY nom
我使用IDataReader 对象返回的结果来填充DataGridView。
最后,我在包含 4 个TextBox 的Panel 中显示每一行的字段。
为了避免 SQL UPDATE 命令用于保存 TextBox 中所做的某些记录的更改,由于列值太长而返回错误消息,我在自定义 Textbox 中添加了一个属性,以直接通知用户值的大小重叠。
这是我的表格
这是用于初始化MaxStringLength属性的VB.Net代码
Private Sub PushColumnConstraints(dr As IDataReader)
Dim tb As DataTable = dr.GetSchemaTable()
Dim nColIndex As Integer = -1
For Each col As DataColumn In tb.Columns
If col.ColumnName = "ColumnSize" Then
nColIndex = col.Ordinal
Exit For
End If
Next
If nColIndex < 0 Then
oT.ThrowException("[ColumnSize] columns's index not found !")
Exit Sub
End If
txtCodePays.MaxStringLength = tb.Rows(0).Item(nColIndex)
txtPays.MaxStringLength = tb.Rows(1).Item(nColIndex)
txtShortCodePays.MaxStringLength = tb.Rows(2).Item(nColIndex)
txtDefaultDevise.MaxStringLength = tb.Rows(3).Item(nColIndex)
End Sub
在For循环中,程序搜索ColumnSize列值中包含的字段的索引。
MaxStringLength 属性使用以下语法分配
tb.Rows(%TEXT-BOX-INDEX%).Item(nColIndex)
.Rows(%TEXT-BOX-INDEX%) 用于标识 SQL SELECT 中的列的元数据!
.Item(nColIndex) 用于获取特定列的元数据值
Item(n) 可以返回 String 或 Integer,但 VB.Net 会在必要时进行隐式转换。
这行代码也可以很快写出来
tb.Rows(%TEXT-BOX-INDEX%)(nColIndex)
tb(%TEXT-BOX-INDEX%)(nColIndex)
但它不可读!
注意:MaxStringLength 是自定义属性。它不是普通 TextBox 的一部分。
在上面的打印屏幕中,您可以看到程序向用户指示Code Pays (3 lettres) TextBox 的长度太大。
错误消息显示在表单底部的StatusBar 中。
此信息在单击生成 SQL UPDATE 命令的SAVE 按钮之前显示。
调用PushColumnConstraints方法的代码如下
Public Sub FillPanel()
SQL =
<sql-select>
SELECT code_pays
,nom
,code_pays_short
,default_devise
FROM pays
ORDER BY nom
</sql-select>
Dim cmd As New NpgsqlCommand(SQL, cn)
Dim dr As NpgsqlDataReader
Try
dr = cmd.ExecuteReader()
Catch ex As Exception
ThrowException(ex)
End Try
Call PushColumnConstraints(dr)