首页 > 解决方案 > VB.Net Windows 窗体数据绑定

问题描述

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

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

在此处输入图像描述

它如何加载:

它是如何加载的

当我选择组合框时:

当我选择 cmbox

  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

标签: vb.netdata-bindingcombobox

解决方案


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

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

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

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


推荐阅读