【问题标题】:Next button to navigate Access database rows导航 Access 数据库行的下一步按钮
【发布时间】:2016-03-20 01:23:44
【问题描述】:

我有代码,当你按下下一个按钮时,它会滚动数据库行,但我希望它在到达最后一行时显示错误,当你点击下一个时,它不能再进一步,因为它是最后一行,但似乎一直循环在我身上,当我按下下一个按钮时永远不会结束?有任何想法吗? 我有一个变量,它在表单加载时是 = 到 -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

表单加载:

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

【问题讨论】:

  • 当您可以简单地禁用按钮时,为什么要允许他们单击“下一步”按钮并显示错误?预防几乎总是胜于治疗。此外,您应该摆脱所有这些代码并改用数据绑定。将您的 DataTable 绑定到 BindingSource 并将其绑定到控件。然后,您只需在BindingSource 上调用MovePreviousMoveNext 即可导航。
  • 好吧,错误只显示在表格的最后一行,所以假设我们有 10 行,我希望它在您到达第 10 行时显示错误,然后再次点击它直到显示那个错误说没有更多的行。
  • 那么你想设计糟糕的软件,我不想鼓励这样做。当您决定要编写好的软件时,我会回来提供帮助。
  • 好吧,这不是一个糟糕的软件,因为它只是一个大学项目,所以它不会被发布,我只是被指示制作一个下一个和上一个按钮来来回滚动浏览数据我创造它的方式是最好的匹配。我以前从未使用过此绑定源,也没有听说过它,但我非常感谢您的帮助。谢谢!

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


【解决方案1】:

这就是 jmcilhinney 先生在 cmets 中所描述的内容(以及其他一些注释和观察):

' 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 语句可能会导致各种错误。使用块关闭并在最后处理东西以释放资源。

另请注意,如果您有一个 DataTable 的所有客户,您可以使用 that 在根据上一个问题删除之前查看#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 源的“名称”数据库数据。 CheckBoxActive 数据(布尔)显示为 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 中任意数量的行的全部内容。将它们设置为执行此操作需要几行代码,尽管很少。

【讨论】:

  • 我很欣赏这一切,但遗憾的是我喜欢坚持使用我自己的代码,因为上面的代码似乎太复杂了,我不喜欢哈哈。我创建了一个返回开始并转到最后一行按钮,该按钮有效,我的上一个按钮所有工作我真正需要的是一些修复,当您转到最后一行并想再次按下一个时,它会显示一个错误,说这是最后一条记录(行)。我会使用上面的代码,但我不知道如何在我的后面实现它以开始并转到最后一行按钮或执行前一个,因为我从未使用过绑定(老实说,第一次听说它!)但是谢谢!
  • 除了设置绑定之外,与手动映射相比,它实际上更简单,代码更少,做更多事情。 MoveNext()MovePrevious()、'MoveFirst()` 和 MoveLast()。还有查找和过滤的方法,因此您可以在不触发查询的情况下检查 #30。
  • 我不认为你可以使用它来完成整个最后和第一部分,所以这很酷,我将编辑我的代码,希望它会起作用。如果我需要帮助,我会在这里发帖!再次感谢 Plutonix 的众多支持!:)
  • 如果您使用向导,他们会将其中一些内容的组件版本添加到表单中并为您完成所有这些工作这些人永远不会知道发生了什么或如何有用。另请注意要点 #2 - 如果您花时间设置它们并了解它们的作用,这些东西会非常强大。
  • 是的,这很酷,但我需要的只是做我需要的简单的事情。这是我正在做的部分的屏幕截图:imgur.com/BtwMpBm 几乎当您按下搜索按钮时,您会看到上面预加载第一行的部分,当您按下下一个时,它会移动到第 2 行,依此类推。话虽如此,我正在添加上面的代码(我在这里可能看起来像个菜鸟,但它说 ACEConnStr 没有声明它是正确的,我会将 ACEConnStr 调暗为什么?)谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
相关资源
最近更新 更多