2012-02-23 140 views
0

這看起來像一個簡單的修復,但我無法弄清楚。我試圖在subForm(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語句

+0

當你說參數化查詢時,你是什麼意思? – 2012-02-24 21:14:46

+1

而不是串聯你的值,你把'?'作爲佔位符,然後設置參數值。這可以解決問題,比如你的比賽名稱是「O'Brien's Cup」,同時也消除了潛在的[SQL注入](http://xkcd.com/327/)攻擊。這裏是c#的Access [示例](http://stackoverflow.com/questions/9401888/parameterized-query-for-inserting-values)。對不起,我找不到任何VB.NET訪問,但它並沒有完全不同。 – 2012-02-24 21:24:23

+0

當我使用你提供的代碼時,我得到一個錯誤:「重載解析失敗,因爲沒有可訪問的'AddTournamentsRow'接受這個數量的參數編輯:我只是回答我自己的問題顯然,MasterDataSet沒有所有這些參數(還是新的) – 2012-02-24 23:12:16

0

這就是我的答案,我希望你喜歡它。在我的項目中,我有一個配電盤,並在該配電盤中包含數據的數據網格視圖。在用戶使用查詢時,它只能自我刷新,並且會自我刷新。我教過它如何做到與衆不同。所以我使用這種技術的定時器刷新效果。它是如何工作的我把一個計時器,並在計時器中複製並粘貼這個代碼從表單加載。

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

並且在定時器的設定我打開它,並每9秒它重新加載你可以改變它的數據,它重新加載,如果每1秒你喜歡取決於它有多少記錄。我希望這個答案無論如何都能幫助你。它適合我。

+0

我需要使用定時器嗎 – 2013-08-12 23:51:11

+0

這取決於你想要完成什麼保羅我使用了一個定時器在定時器中輸入代碼,我選擇了幾秒鐘或者幾分鐘或幾小時,我希望它能夠刷新,以便我的同事可以看到新的數據 – NOE2270667 2013-08-13 13:18:57