【问题标题】:In VB.Net, how to repopulate a datagrid from scratch?在 VB.Net 中,如何从头开始重新填充数据网格?
【发布时间】: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 语句,因为您接受默认的 CommandTypeText
  • 如果绑定后没有行,则数据源中没有行。您可以通过查看Fill 方法返回的数字来检查检索了多少条记录。
  • 感谢大家的回复。为了清除列集合,我添加了以下行:
  • 如果您的查询可能不会产生具有相同架构的结果集,那么您需要从网格中清除现有列。为此,请将DataSource 设置为NothingClearColumns 集合,然后再次设置DataSource。这将自动生成新列。
  • 感谢大家的回复。为了清除列集合,我更改了原始问题中的代码块,以显示我更新后的尝试遵循 jmcihinney 的指示。当我这样做时,无论是在将数据源设置为空的行的上方还是下方,我都会在第一次通过时得到一个空白的数据网格。在编写“FindWordGrid.Columns.Clear()”时,似乎完全拆除了数据网格功能。难道我做错了什么?相对而言,我可以建议复制我描述的简单设置并测试您的修复吗?谢谢你。 ~ 彼得·弗伯

标签: vb.net datatable datagrid sqlcommand dataadapter


【解决方案1】:

因此,对您发布的 DefineDataGrid 代码进行了一些修改。似乎为我工作。我怀疑可能与导致问题的 cmd 或 con 对象的生命周期有关。解析多个不同数量的查询并正确重建datagridview

Sub DefineDataGrid(ByVal strQuery As String)
    Dim dt As New DataTable
    FindWordGrid.DataSource = Nothing
    Using con As New SqlConnection("Your Connection String Here")
        Using cmd As New SqlCommand(strQuery, con)
            Dim da = New SqlDataAdapter(cmd)
            da.Fill(dt)
            FindWordGrid.DataSource = dt
        End Using
    End Using
End Sub

将 con 和 cmd 的明显模块级实现更改为局部变量,并且由于这两种类型都实现 IDisposable,因此将它们包装在 Using 模式中

【讨论】:

  • 太棒了,赫西。感谢您对此的尽职调查。我第二次遇到“da.Fill(dt)”行时出现错误,我得到的错误是“连接字符串属性未初始化”。没关系,在我看来,您对生命周期的评估是正确的。我会继续拉面。你已经成功了,这告诉我解决方案就在眼前。非常感谢!
  • @user3621522,发布的代码明确表示 "Your Connection String Here" 因此,如果您的 ConnectionString 属性未设置,则您忽略了该部分。
  • 贴出的代码在清除DataSource后忽略了清除网格的列,这意味着之前查询的列将保留。
  • 太棒了,赫西。感谢您对此的尽职调查。我第二次遇到“da.Fill(dt)”行时遇到错误,说“连接字符串属性未初始化”。因此,我更改了在子例程中创建了一个新连接,这样可以防止错误发生,但旧的字段配置在第二次运行期间仍然有效。我有信心我走在正确的轨道上,因为您使用这种方法的成功率已经得到证实。干得好,谢谢!
  • @user3621522,也许用您最近的尝试更新您的问题,并包括您如何创建连接
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多