用于导航Access数据库行的下一个按钮

时间:2016-03-20 01:23:44

标签: .net database vb.net data-binding

我有代码,当你按下下一个按钮它滚动数据库行但我希望它一旦到达最后一行就显示错误,当你点击下一步它不能再进一步作为它的最后一行但它似乎当我点击下一个按钮时,继续循环播放我并且永远不会结束?有任何想法吗? 我有一个变量,在formload上为= to -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 个答案:

答案 0 :(得分: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. 如果您只使用一个表,则不需要DataSet来存储表。
  2. 如图所示,您不需要DataAdapter来填充表格,特别是如果您只在本地使用它们。您可能需要表单级别(如DT或BindingSource)来轻松更改表格:myDa.Update(dtSample) 1
  3. 如果您计划通过DataTable添加数据或在DataGridView中显示数据,则有助于在SQL中指定列顺序,而不是SELECT *
  4. 使用Access有点不太正确,但您应该打开,使用然后处置Connection对象。一个丢失的con.Close语句可能会导致各种错误。使用块关闭并在最后处置事物以释放资源。
  5. 另请注意,如果您拥有所有客户的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的Text属性设置为显示来自bsSample源的“名称”DB数据。 CheckBox会将Active数据(bool)显示为Checked属性。

    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设置为DataTable只是为了看看它是多么容易使用。太多人不必为此受到惊吓。

    1 这就是通过DataAdapter同时添加,删除和更新DataTable中任意数量的行的全部内容。将它们设置为执行此操作需要几行代码,但令人惊讶的是很少。