刷新数据网格视图

Posted

技术标签:

【中文标题】刷新数据网格视图【英文标题】:Refreshing a data grid view 【发布时间】:2012-02-23 18:22:42 【问题描述】:

这看起来很容易解决,但我想不通。我正在尝试在子表单(NewTournament)上设置按钮单击事件,将记录添加到数据库,然后通知数据网格自动列出来自同一数据库的记录(网格在 HomeForm 上列出)。

所以我能够更新数据库并调用一个新窗口。但我无法让它刷新该数据网格的任何内容。我知道我应该清除数据网格,获取更改,然后重新填充网格。但是每次我这样做时,代码都不会更新。此外,我可以很好地看到正在添加记录。

Private Sub CreateTournament_Click(sender As System.Object, e As System.EventArgs) Handles CreateTournament.Click
    ' Check the form for errors, if none exist.
    ' Create the tournament in the database, add the values where needed. Close the form when done.

    Dim cn As OleDbConnection
    Dim cmd, cmd1 As OleDbCommand
    Dim icount As Integer
    Dim str, str1 As String

    Try
        cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Users\Paul Williams III\Documents\Visual Studio 2010\Projects\Everything OP Client\Everything OP Client\Master.mdb'")
        cn.Open()
        str = "insert into Tournaments (SanctioningID,TournamentName,TournamentVenue,TournamentDateTime,TournamentFirstTable,Game,Format,OrganizerID) values(" _
            & CInt(SanctioningIDTxt.Text) & ",'" & Trim(TournamentNameTxt.Text) & "','" & _
            "1" & "','" & EventDateTimePck.Value & "','" & TableFirstNumberNo.Value & "','" & GameList.SelectedIndex & "','" & FormatList.SelectedIndex & "','" & Convert.ToInt32(ToIDTxt.Text) & "')"

        'string stores the command and CInt is used to convert number to string
        cmd = New OleDbCommand(str, cn)
        str1 = "select @@Identity"
        icount = cmd.ExecuteNonQuery
        cmd1 = New OleDbCommand(str1, cn)
        Counter = CInt(cmd1.ExecuteScalar)
        MessageBox.Show(Counter & " was the last inserted id")
        'displays number of records inserted

        HomeForm.MasterDataSet.Clear()
        HomeForm.MasterDataSet.GetChanges()
        HomeForm.TournamentsTableAdapter.Fill(HomeForm.MasterDataSet.Tournaments)
        HomeForm.DataGridView1.Refresh()

    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try

    Me.Close()

    Dim n As New TournamentWindow
    n.TournID = Counter
    n.Show(HomeForm)

End Sub

【问题讨论】:

【参考方案1】:

最好的方法是将记录添加到 DataGrid 的 DataSource 中。 DataGrid 将自动更新。在这种情况下,它可能有点像

HomeForm.MasterDataSet.Tournaments.AddTournamentsRow( CInt(SanctioningIDTxt.Text) , _
                           Trim(TournamentNameTxt.Text) ,  _
                           "1" , _
                           EventDateTimePck.Value, _
                           TableFirstNumberNo.Value,  _ 
                           GameList.SelectedIndex, _
                           FormatList.SelectedIndex, _
                           Convert.ToInt32(ToIDTxt.Text) )

顺便说一句,您可能需要考虑为您的 Insert 语句使用参数化查询

【讨论】:

你说参数化查询是什么意思? 不是在你的值中连接你把? 作为占位符然后设置参数值。这解决了诸如您的锦标赛名称是“O'Brien's Cup”之类的问题,并且还消除了潜在的SQL injection 攻击。这是要访问的 c# 的an example。抱歉,我找不到任何可以访问的 VB.NET,但实际上并没有什么不同。 当我使用您提供的代码时,我收到一个错误:“重载解析失败,因为没有可访问的 'AddTournamentsRow' 接受这个数量的参数。编辑:我刚刚回答了我自己的问题。显然是 MasterDataSet在它的查询中没有所有这些参数。(仍然是新的。)【参考方案2】:

这是我的回答,希望你喜欢。在我的项目中,我有一个交换机,在该交换机中,它包含我的数据的数据网格视图。之前它只在用户使用查询时自行刷新,它会自行刷新。我教了它如何做不同的事情。所以我使用了这种技术的定时器刷新效果。它是如何工作的我放置了一个计时器,并在计时器中从表单加载中复制并粘贴此代码。

Me.ADDRESS_TICKETTableAdapter.Fill(Me.Database1DataSet.ADDRESS_TICKET)

在计时器的设置中,我打开它,每 9 秒重新加载一次数据,您可以更改它,如果您愿意,它每 1 秒重新加载一次,这取决于它进入了多少记录。我希望这个答案对您有所帮助反正。它对我有用。

【讨论】:

我必须使用计时器吗? 这取决于你想要完成保罗什么。我使用计时器在计时器中输入该代码,然后我选择我希望它刷新多少秒或分钟或小时,以便我的同事可以看到新数据

以上是关于刷新数据网格视图的主要内容,如果未能解决你的问题,请参考以下文章

在 vb.net 中更新后刷新数据网格视图

在 C# 中刷新数据视图网格

Telerik gridview:数据库更改后如何刷新网格视图

如何在 C# 中更新或刷新与 Ms-access 连接的数据网格视图

文档准备好后的数据源 ajax kendo 网格,因为模型未正确绑定在部分视图上

ExtJs Gridpanel 存储刷新