2012-02-23 17 views
0

これは簡単な修正のようですが、これを把握することはできません。サブフォーム(NewTournament)でボタンクリックイベントを発生させ、データベースにレコードを追加してから、同じデータベースのレコードを自動的にリストするデータグリッドに通知します(グリッドはHomeFormにリストされています)。データグリッドビューを更新する

私はデータベースを更新して新しいウィンドウを呼び出すことができます。しかし、私は何かのためにそのデータグリッドをリフレッシュすることはできません。私は、DataGridをクリアし、変更を加え、グリッドを補充することになっていることを知っています。しかし、私がこれを行うたびに、コードは更新されません。さらに、私はレコードが追加されていることをよく知ることができます。

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は自動的に更新されます。さておき、あなたの挿入ステートメントの

+0

パラメータ化されたクエリは、どういう意味ですか? –

+1

あなたの値を連結するのではなく、プレースホルダーとして '?'を入れてから、パラメーター値を設定します。あなたのトーナメント名が「O'Brien's Cup」であり、潜在的な[SQLインジェクション](http://xkcd.com/327/)攻撃を取り除いているような問題は修正されています。ここには、Accessへのc#の[example](http://stackoverflow.com/questions/9401888/parameterized-query-for-inserting-values)があります。申し訳ありませんが、私はアクセスするためにVB.NETを見つけることができませんでしたが、実際には異なるものではありません。 –

+0

私が提供したコードを使用すると、次のようなエラーが表示されます: "アクセス不可能な 'AddTournamentsRow'がこの数の引数を受け入れることができないため、オーバーロードの解決に失敗します。 –

0

私はあなたがそれを好き願っています。これは、私の答えのためのパラメータ化クエリを使用して検討する必要がありますように、この場合にはその可能性は

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

ようsomehtingされるように。私のプロジェクトでは、私は交換台を持っていて、その交換台には自分のデータ用のデータグリッドビューが含まれています。ユーザーがクエリを使用したときにそれを更新するだけで、それ自体がリフレッシュされます。違うやり方を教えました。だから、私はこのテクニックをタイマーのリフレッシュ効果に使用しました。どのように動作するのですかタイマーを入れ、タイマーにこのコードをコピーしてフォームロードから貼り付けます。

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

と私はそれをオンタイマーの設定と、9秒ごとに、データを再ロードしますがあれば、それは1秒ごとにリロードすること、それを変更することができますあなたが好きなのは、それが何レコード入ってくるかによって決まります。私はこの回答があなたに役立つことを願っています。それは私のために働く。

+0

または数分または数時間私は私の同僚が新しいデータを見ることができるようにリフレッシュしたい –

+0

これは、ポールを達成したいと思っているかどうかによって決まります。私は、タイマーでそのコードを入力してタイマーを使用して、何秒間を選択するのですか(それはまだまだ新しいものです) – NOE2270667

関連する問題