2016-03-21 4 views
1

私はこの全体的なバインディングのことを初めて知りましたが、基本的に私のフォームの次のボタンを押すと、私はそれがより多くのコードを追加する前にそれがすべて動作することを確認したいので、以下は単なる一時的なものです。DB内の次の行に移動しようとすると重複するバインディングエラーが発生する

セクションをロードすると、フォームに最初の行がプリロードされるので、次を押すと行2に移動し、次に行3などに移動しますが、次に移動するときに移動します行2から行3に渡すと、エラーが発生します。これにより、コレクション内の2つのバインディングが同じプロパティにバインドされます。

コード:

Private Sub click() 
    sql = "Select * from tbl" 
    Using dbcon As New OleDbConnection(ACEConnStr) 
     Using cmd As New OleDbCommand(sql, dbcon) 

      dbcon.Open() 

      dtSample = New DataTable 
      dtSample.Load(cmd.ExecuteReader) 

     End Using 
    End Using 

    ' initialize BS from DT 
    bsSample = New BindingSource(dtSample, Nothing) 

    TxtCI.DataBindings.Add("Text", bsSample, "CustomerID") 
End Sub 

次へ]ボタン:

Private Sub BtnNext_Click(sender As Object, e As EventArgs) Handles BtnNext.Click 
    click() 
    DataBindings.Clear() 
    bsSample.MoveNext() 

    BtnNext.Enabled = (bsSample.Count - 1 > bsSample.Position) 
End Sub 
+0

BtnNext_Clickから 'nClick'を削除します。再クエリする必要はありません。 'DataBindings.Clear()'も削除してください。 nclickのコードは、フォームロードのように一度だけ実行したいものです。これは、1つのDTを作成し、それにBSを関連付けます。どちらも無限に再利用可能です。 – Plutonix

+0

私はnclick()を削除して以来、私はnclick()関数を呼び出しているので、エラーが発生します。オブジェクト参照がオブジェクトのインスタンスに設定されていません。 –

+1

どこのオブジェクト/行ですか? (関数ではなく、メソッドです)。そのコードは実行する必要がありますが、フォームロードのように一回だけ* – Plutonix

答えて

0

このコードブロックは:

Private Sub nclick() 
    sql = "Select * from tblcustomer" 
    Using dbcon As New OleDbConnection(ACEConnStr) 
     Using cmd As New OleDbCommand(sql, dbcon) 

      dbcon.Open() 

      dtSample = New DataTable 
      dtSample.Load(cmd.ExecuteReader) 
     End Using 
    End Using 

    ' initialize BS from DT 
    bsSample = New BindingSource(dtSample, Nothing) 
    TxtCI.DataBindings.Add("Text", bsSample, "CustomerID") 
    TxtName.DataBindings.Add("Text", bsSample, "Title") 
    ChkSales.DataBindings.Add("Checked", bsSample, "SalesCustomer") 
End Sub 

...一度実行する必要があるが、一度のみ。それをフォーム全体に移動します。その後:

Private Sub BtnNext_Click... 
    bsSample.MoveNext() 

    BtnNext.Enabled = (bsSample.Count - 1 > bsSample.Position) 
End Sub 

は、私は、これは検索ダイアログまたは何であるかどうかわからないのですが、すべての顧客のためのDataTableは、アプリケーション全体の用途持つことができることに留意すべきである - 顧客の#30がしようとする前に存在するかどうかどうかのチェックなどをそれらを削除します。

+0

私はちょうど私が持っている最後の問題は、それが動作する行の最後に行くために私のボタンを押したとき、私は前に数回、次のbtnが(行の最後にあるように)コード: 'Private Sub BtnSEnd_Click(EventArgsとしての送信者)BtnSEnd.Clickを処理します。 bsSample.MoveLast() End Sub' –

+1

最後に到達すると(' bsSample.Count - 1> bsSample.Position')、ボタンは組織の質問に従って無効になります。それは本当に必要ではありません:あなたがセットの最後を超えてMoveNextを試みるときに悪いことは起こりません。そのようにするには、そのコードを他のボタンにも追加する必要があります。あなたが終わりに達すると、それは無効になります。あなたがMovePrevを起動すると、それは元に戻ります。あなたはすべてのボタンのような行が必要です – Plutonix

+0

ああ、私は理解し、いくつかのif文でそれを解決しました!ヘルプありがとう:) –

関連する問題