2016-03-20 4 views
1

次のボタンを押すとデータベースの行をスクロールするコードがありますが、最後の行にヒットしたらエラーが表示されます。その最後の行が私にループを維持するようだと私は次のボタンを押すと終了しない?何か案は? 私は、formloadに=〜-1の変数を持っています。次のボタンを使用してデータベースにアクセスする

コード:

Private Sub searchclickbinds() 
    If con.State = ConnectionState.Closed Then con.Open() 
    'create data adapters 
    sql = "Select * from tbl" 
    da = New OleDbDataAdapter(sql, con) 
    da.Fill(ds, "tbl") 
    RecCnt = ds.Tables("tbl").Rows.Count 'how many records in ds 

    TxtCI.Text = ds.Tables("tbl").Rows(inc).Item(0) 

    Dim word 
    word = ds.Tables("tbl").Rows(inc).Item(15) 

    con.Close() 
End Sub 

発信者:

Private Sub BtnNext_Click(sender As Object, e As EventArgs) Handles BtnNext.Click 
    If inc <> RecCnt - 1 Then 
     inc = inc + 1 
     nclick() 
    End If 

End Sub 

Formload:

Private Sub main_Load(sender As Object, e As EventArgs) Handles Me.Load 
    inc = -1 
End Sub 
+1

なぜボタンを無効にすることができたら、[次へ]ボタンをクリックしてエラーを表示するのはなぜですか?予防は治療よりも常に良いです。また、すべてのコードを取り除き、代わりにデータバインディングを使用する必要があります。あなたの 'DataTable'を' BindingSource'にバインドし、それをコントロールにバインドします。次に、 'BindingSource'で' MovePrevious'または 'MoveNext'を呼び出すだけでナビゲートできます。 – jmcilhinney

+0

さて、エラーはテーブルの最後の行にのみ表示されるので、10行が得られたとしましょう。10行目になったときにエラーを表示し、次にもう一度ヒットするとエラーが表示されます。 –

+0

あなたは悪いソフトウェアをデザインしたいと思っています。私はそれを奨励することを望んでいません。私はあなたが良いソフトウェアを書くことを決定したときに助けに戻ってきます。 – jmcilhinney

答えて

0

これは氏jmcilhinneyが他のいくつかのノートや観察と一緒に(コメント欄に記載したものです):

' form level vars we need: 
Private bsSample As BindingSource 
Private dtSample As DataTable 
Private ACEConnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0...YOUR CONN STRING..." 

は、次にデータをロード:

Dim sql = "SELECT Id, Name, Descr, ValueA, Fish, Bird, Color, Active FROM Sample" 

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 
  1. あなただけの1台で作業している場合は、テーブルを格納するデータセットを必要としません。
  2. 示されているように、特にローカルでのみ使用している場合は、テーブルを埋めるためにDataAdapterは必要ありません。あなたは簡単にテーブルに変更を加えること(DTまたはのBindingSourceなど)フォームレベル1にしたいことがあります。myDa.Update(dtSample)
  3. あなたはDataTableを通してデータを追加したり、DataGridViewでデータを表示することを計画している場合、それが指定することができますSQLではカラム順ではなくSELECT *
  4. これはAccessではあまり真実ではありませんが、Connectionオブジェクトを開いて使用してから処分する必要があります。 1つの紛失con.Closeステートメントは、さまざまなエラーを引き起こす可能性があります。ブロックを使用して、リソースを解放するために最後のものを閉じて処理します。あなたはすべての顧客のDataTableを持っている場合

も注意してください、あなたは#30が、前の質問ごとに削除する前に存在しているかどうかを確認するためにを使用することができることを。バインディング:

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

tbName.DataBindings.Add("Text", bsSample, "Name") 
tbDescr.DataBindings.Add("Text", bsSample, "Descr") 
chkActive.DataBindings.Add("Checked", bsSample, "Active") 

最初の行はBindingSourceを初期化します。最後の部分は "マッピング"を設定します。たとえば、テキストプロパティtbNameは、bsSampleソースからの "名前" DBデータを表示するように設定されています。 CheckBoxにはCheckedプロパティとしてActiveデータ(bool)が表示されます。

BindingSourceには、使用できるすべてのメソッドとプロパティがあります。あなたの[次へ]ボタン:ユーザーがコントロールに変わり

Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click 
    bsSample.MoveNext() 

    btnNext.Enabled = (bsSample.Count - 1 > bsSample.Position) 
    ' To Do: add similar code for btnPrev 
End Sub 

DataTableではなく、データベースに適用されます。ユーザーがこの方法を編集できるようにしたくない場合は、簡単な方法はDataViewを使用することです:

Dim dv = New DataView(dtSample) 
dv.AllowEdit = False 
bsSample = New BindingSource(dv, Nothing) 

また、フィールドごとにソースへの更新を無効にすることができます

tbName.DataBindings.Add("Text", bsSample, "Name", False, DataSourceUpdateMode.Never) 

は、おそらく最も簡単なのは次のとおりです。

dgv.ReadOnly = True 
dgv.DataSource = dtSample 

がフォームにDataGridViewのをドロップし、あなたにDataSourceを設定してください。それが使い方が簡単です。あまりにも多くの人が不必要にそれを恐れています。

これは、DataAdapterを通じてDataTableの任意の数の行を一度に追加、削除、更新することです。これを行うように設定するには、数行のコードが必要ですが、驚くほど少ない数です。

+0

私はこの全部に感謝しますが、悲しいことに、上記のように自分のコードに固執するのが好きです。私は開始するには、バックを作成し、最後の行のボタンに行くと私の前のボタンはすべて私が本当に必要なすべての作品は、最後の行に移動し、次の最後のレコード(行)。私は上記のコードを使用するが、私はどのように私の背中にこれを実装する方法を知っていないと最後の行のボタンに行くか、私はバインディングを使用したことがない(前に正直言って聞いて! –

+0

バインディングを設定する以外は、手作業でマッピングするよりもコードを少なくして、実際には簡単です。 'MoveNext()'、 'MovePrevious()'、 'MoveFirst()'、および 'MoveLast()'です。検索とフィルタリングの手段もありますので、クエリを実行せずに#30を確認できます。 – Plutonix

+0

私はこれを使って最後と最初の部分をやってみることができないと思っていませんでした。私はコードを編集してうまくいけばうまくいきます。私が助けを必要とするなら私はここに投稿します! :) –

関連する問題