【问题标题】:VB.Net Windows Form DatabindingVB.Net Windows 窗体数据绑定
【发布时间】:2020-10-01 16:57:44
【问题描述】:

我正在尝试(新手)创建一个简单的应用程序,用户可以通过添加、删除或更新当前记录来更新 sql 数据库中的数据表。因此,我创建了表单并在其中有组合框,该组合框连接到我的数据库中的数据表。我想将所选记录的值加载到该组合框中,但也有可用于更新数据库中该记录的选项列表。我的代码的问题是,它具有正确的记录对应值,但没有显示。此外,当我选择组合框时,表中的其他值不存在。该值被复制了 2 次。

以下是组合框的绑定方式:

如何加载:

当我选择组合框时:

  Public Sub FillDriverDataSet()      
    Dim sql As String
    Dim dt As New DataTable
    Dim ds As New DataSet
    Dim dv = New DataView(ds.Tables("Drivers"))
    Dim bs As New BindingSource
    Dim cm As CurrencyManager


    sql = "SELECT * FROM tCommercialDrivers where id = 23"
    OpenConnection()

    Dim adapter As New SqlDataAdapter(sql, connection)

    Dim drivers As New SqlDataAdapter(sql, connection)
    adapter.Fill(dt)
    drivers.Fill(ds, "Drivers")
    dv = New DataView(ds.Tables("Drivers"))
    cm = CType(Me.BindingContext(dv), CurrencyManager)
    bs.DataSource = dt


    adapter.Fill(dt)

    drpRouteType.DataSource = dt
    drpRouteType.DisplayMember = "RouteType"
    drpRouteType.ValueMember = "RouteType"

    txtRoute.DataBindings.Clear()
    txtRoute.DataBindings.Add("text", dv, "RouteID")

  End Sub

【问题讨论】:

  • 看起来你对所有这些数据集有点绕圈子。您还将数据访问方法与所有“按钮单击处理程序中的 SQL 字符串”以及您的数据表混合在一起。您应该只使用您的数据集和表格适配器来执行此操作,但目前尚不清楚您对这一切有多少纠结。如果您可以考虑发布整个项目,看看会有所帮助
  • 好的,所以在阅读了你的笔记之后,我清理了代码(我认为)并且它可以工作

标签: vb.net data-binding combobox


【解决方案1】:

作为它应该如何工作的概述(请记住,我看不到您的数据库结构,所以我猜测了一下)

  • 打开连接管理器
  • 添加到 sql server 的连接
  • 在项目中新建DataSet类型项
  • 打开数据集
    • 将例如 CommercialDrivers 表从连接管理器中拖到 DataSet 中,然后右键单击表适配器并选择 configure ,或者
    • 右击DataSet并选择add tableadapter,配置连接,选择“select that retrieves rows..”
  • 添加或修改(取决于您在上面所做的)sql 所以它是SELECT * FROM commercialDrivers WHERE iD = @DriverId
  • 调用您的方法 FillById 和 GetDataById
  • 完成
  • 对包含 RouteTypes 的表重复上述过程,但因为我们不是单独选择它们,所以不要添加 where 子句并保留 Fill 和 GetData 的默认名称
  • 您现在应该有一个包含两个表的 DataSet,并且可能在它们之间有一条数据关系线。该关系对于我们的需求并不是绝对必要的,可以删除
  • 创建一个新表单并打开它
  • 在视图菜单上打开数据源窗口(其他窗口)
  • 从数据源中将 routetypes 节点拖到表单中,然后删除出现的网格视图和 bindingnavigator - 保留出现的其他内容,因为它会很有用
  • 重命名底部托盘中的 DataSet,以便将其称为其他名称(任何名称;我们只希望实例名称与类型名称不同,因为它可能会导致混淆将变量命名为与类型相同的名称。我前缀带有下划线的名称,tableadapters 也是)
  • 在数据源窗口中单击 CommercialDrivers 旁边的下拉菜单并将其更改为 Details 模式,展开节点,将 RouteType 更改为组合框
  • 将CommercialDrivers父节点拖到窗体,会出现一堆控件,数据绑定已经设置到窗体上的DataSet
  • 获取路由类型组合的属性:
    • 将下拉样式更改为下拉列表
    • 将 DataSource 更改为 routetypesbindingsource
    • 将 displaymember 更改为路由类型文本列
    • 将 valuemember 更改为包含路由类型 ID 的任何列
    • 在属性网格顶部的(数据绑定)节点中,检查 selectedvalue 是否绑定到 CommercialDrivers.RouteTypeId(CommercialDrivers 绑定源,数据成员路由类型 id),并从文本属性中删除绑定。带有后备列表的组合应该有 selectedvalue 绑定,而不是文本

就是这样;您必须编写或整理的一行代码是用相关 ID 填充 CommercialDriver 表。从技术上讲,它可能是零线; Visual Studio 可能已经为您完成了这项工作,方法是在您将详细信息拖入表单时放置一个带有文本框和填充按钮的绑定导航器,但您可能想要更改它的完成方式。 DataSet 中的路由类型表在表单加载中填充,所有不同的路由类型,组合将读取例如商业驱动程序表的 routetypeid 值为 4,在其 value 成员中的列集合中查找该值(在路由类型中数据源中设置的表)并显示它在其显示成员的列集中找到的值。如果您将组合更改为其他内容,它会从新行(从 valuemember 中设置的列)获取值并将该值写入商业驱动程序表 routetypeid 从而更改该驱动程序的路由类型

写下来时看起来很多(如果你在任何时候卡住了,请告诉我;我是凭记忆写的,面前没有视觉工作室,在手机上,所以可能有些细节我忘记了)但实际上,当您习惯了该过程时,可能需要大约一分钟才能完成此操作。 VS 会编写您所做的所有代码 - 如果您有兴趣,可以在各种 .Designer 文件中看到它

【讨论】:

    【解决方案2】:

    所以我把它清理了一下,现在它可以工作了。如果您仍然看到我本可以做得更好的事情,请告诉我。感谢您的回复!

    Public Sub FillDriverDataSet() 将 sql 调暗为字符串

        Dim ds As New DataSet
        Dim dv = New DataView(ds.Tables("Drivers"))
        Dim bs As New BindingSource
        Dim cm As CurrencyManager
    
    
        sql = "SELECT * FROM tCommercialDrivers where id = 26"
        OpenConnection()
    
        Dim drivers As New SqlDataAdapter(sql, connection)
    
        drivers.Fill(ds, "Drivers")
        dv = New DataView(ds.Tables("Drivers"))
        cm = CType(Me.BindingContext(dv), CurrencyManager)
    
        drpRouteType.DataBindings.Clear()
        drpRouteType.DataBindings.Add("text", dv, "RouteType")
    
    
        txtRoute.DataBindings.Clear()
        txtRoute.DataBindings.Add("text", dv, "RouteID")
    
        txtDriverID.DataBindings.Clear()
        txtDriverID.DataBindings.Add("text", dv, "DriverID")
    
        txtEmailAddress.DataBindings.Clear()
        txtEmailAddress.DataBindings.Add("text", dv, "EmailAddress")
    
        txtDriverName.DataBindings.Clear()
        txtDriverName.DataBindings.Add("text", dv, "DriverName")
    
        txtDollYd.DataBindings.Clear()
        txtDollYd.DataBindings.Add("text", dv, "YardageAmt")
    
        txtDayRate.DataBindings.Clear()
        txtDayRate.DataBindings.Add("text", dv, "DayRate")
    
        cbxActive.DataBindings.Clear()
        cbxActive.DataBindings.Add("Checked", dv, "IsActive")
    
        cbxIncentive.DataBindings.Clear()
        cbxIncentive.DataBindings.Add("Checked", dv, "IncentivePay")
    
        ' dteExpDate.DataBindings.Clear()
        'dteExpDate.DataBindings.Add("text", dv, "ExperienceDate")
    
    
    End Sub
    

    【讨论】:

    • 那个CurrencyManager有什么用? + 您正在填充单个 DataTable,因此填充 DataTable,而不是 DataSet + 不需要 DataView,仅使用 DataTable 的列名进行绑定。最好将 DataTable 分配给可以存储为字段的 BindingSource,以防您需要过滤、排序或其他任何操作,然后使用此对象进行绑定。
    • 使用此代码,您可能仍然会买狗并自己吠叫;如果您使用的是 tableadapter,那么您的代码就不需要提及:“SQL in a string”、dataadapter、bindings.anything、currencymanager...
    • 它应该是您的大约 1 行代码,其余所有代码都隐藏在 formx.Designer.cs 中,只需单击几下鼠标即可编写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2011-01-17
    相关资源
    最近更新 更多