【发布时间】:2021-02-03 20:19:27
【问题描述】:
我编写了一个通用的 VB.net 子例程,它用查询结果填充数据网格。子例程作为一个参数,strQuery,它是一个字符串,可以转换为任何有效的 SQL-Server 视图或返回记录集的存储过程。除此之外,对 SQL 代码没有任何限制,发送两个具有完全不同字段配置文件的查询是一个有效的提议。
为了让它工作,我必须彻底清除以前存在的任何数据集的数据网格,从而允许控件放弃其先前的身份并重新开始,允许从头开始重新定义新的日期集控件的内容。
我终于解决了这个问题。也许我应该提到我正在使用 Visual Studio 2010,如果 Hersey 使用的是更高版本,那么对他有用的代码可能对我不起作用。对我的代码的更改是另外一行:将 name 和 datapropertyname 设置为相同的名称。我注意到,当我去查看列视图时,我注意到 datapropertyname 是表如何链接到源,而 name 是字段的有效别名,它将如何呈现。显然,为了清楚起见,两者必须相同!这现在可以像宣传的那样工作。 谢谢,〜彼得·弗伯
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection("<Enter Connection string here>")
Dim rcd As ADODB.Recordset = ReturnRecordset("Select * From ExcludeWords")
Call DefineDataGrid("Select * From ExcludeWords")
End Sub
Private Sub btnUpdate_Click(sender As System.Object, e As System.EventArgs) Handles btnUpdate.Click
Call DefineDataGrid("Select * From FindWords")
End Sub
Sub DefineDataGrid(ByVal strQuery As String)
Dim con As New SqlConnection("<Enter Connection String Here>")
Dim dt As New DataTable
FindWordGrid.Columns.Clear()
FindWordGrid.DataSource = Nothing
Dim rcd As ADODB.Recordset = ReturnRecordset(strQuery)
Dim MyField As ADODB.Field
Dim iCount As Integer = -1
FindWordGrid.ColumnCount = rcd.Fields.Count
For Each MyField In rcd.Fields
iCount = iCount + 1
FindWordGrid.Columns(iCount).Name = MyField.Name
FindWordGrid.Columns(iCount).DataPropertyName = MyField.Name
Next
Dim cmd As New SqlCommand(strQuery, con)
Dim da = New SqlDataAdapter(cmd)
da.Fill(dt)
FindWordGrid.DataSource = dt
End Sub
Function ReturnRecordset(strQuery As String) As ADODB.Recordset
Dim con As ADODB.Connection = "<Enter Connection string here>"
ReturnRecordset = New ADODB.Recordset
ReturnRecordset.Open(strQuery, con)
End Function
我的设置很容易重现:我使用的数据集在每个表中只有少量记录。唯一的限制是各个运行必须具有不同的字段配置文件。一天中的大部分时间我都在尝试不同的技术,现在我认为最好在这个主题上获得一些新的灰质。正确地完成这个过程是我最后一个主要障碍,在做一个我希望做的关键演讲,在游说一个工作角色时。提前感谢您的 cmets、想法和想法。
真诚的,〜彼得·弗伯
【问题讨论】:
-
首先,您的代码将不适用于“任何有效的 SQL-Server 视图或存储过程”。它仅适用于实际的
SELECT语句,因为您接受默认的CommandType或Text。 -
如果绑定后没有行,则数据源中没有行。您可以通过查看
Fill方法返回的数字来检查检索了多少条记录。 -
感谢大家的回复。为了清除列集合,我添加了以下行:
-
如果您的查询可能不会产生具有相同架构的结果集,那么您需要从网格中清除现有列。为此,请将
DataSource设置为Nothing、Clear和Columns集合,然后再次设置DataSource。这将自动生成新列。 -
感谢大家的回复。为了清除列集合,我更改了原始问题中的代码块,以显示我更新后的尝试遵循 jmcihinney 的指示。当我这样做时,无论是在将数据源设置为空的行的上方还是下方,我都会在第一次通过时得到一个空白的数据网格。在编写“FindWordGrid.Columns.Clear()”时,似乎完全拆除了数据网格功能。难道我做错了什么?相对而言,我可以建议复制我描述的简单设置并测试您的修复吗?谢谢你。 ~ 彼得·弗伯
标签: vb.net datatable datagrid sqlcommand dataadapter