绑定多个表格的按钮
Posted
技术标签:
【中文标题】绑定多个表格的按钮【英文标题】:Binding Buttons for Multiple Tables 【发布时间】:2013-04-28 00:10:52 【问题描述】:我正在设计一个 Windows 用户表单。您可以看到here 的表单,问题是大多数文本框从未填充数据。我正在尝试使用表单顶部的按钮来“浏览”数据库并添加、修改和删除记录。
我似乎没有正确的 SQL 查询来获取来自不同表的所有数据,以便我的 DataAdapter
可以将其发送到表单。我正在寻求帮助来生成正确的查询并将数据传递给表单。您可以看到数据库here 的构成。如果有人可以帮助我,那就太棒了。
表单的代码如下。
Imports System.Data.OleDb
Public Class DeviceEditorForm
Dim tabletDataAdapter As OleDbDataAdapter
Dim tabletDataSet As DataSet
Private Sub DeviceEditorForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.DeviceTableAdapter.Fill(Me.BIT_3444_DatabaseDataSet.Device)
Dim sqlStatement As String = "select * from Device"
Dim tabletConnectionStr As String = "provider=microsoft.ace.oledb.12.0;data source=" & Application.StartupPath & "\BIT 3444 Database.accdb"
tabletDataAdapter = New OleDbDataAdapter(sqlStatement, tabletConnectionStr)
tabletDataSet = New DataSet
tabletDataAdapter.Fill(tabletDataSet, "Device")
DeviceBindingSource.DataSource = tabletDataSet.Tables(0)
BindingNavigator1.BindingSource = DeviceBindingSource
Dim batterySizeBinding As New Binding("text", DeviceBindingSource, "Battery_Size")
BatterySizeTextBox.DataBindings.Add(batterySizeBinding)
Dim IDBinding As New Binding("text", DeviceBindingSource, "ID")
DeviceIdTextBox.DataBindings.Add(IDBinding)
Dim nameBinding As New Binding("text", DeviceBindingSource, "Device_Name")
DeviceNameTextBox.DataBindings.Add(nameBinding)
Dim manufacturerBinding As New Binding("text", DeviceBindingSource, "Manufacturer")
ManufacturerTextBox.DataBindings.Add(manufacturerBinding)
Dim modelYearBinding As New Binding("text", DeviceBindingSource, "Model_Year")
ModelYearTextBox.DataBindings.Add(modelYearBinding)
Dim osBinding As New Binding("text", DeviceBindingSource, "Operating_System")
OperatingSystemTextBox.DataBindings.Add(osBinding)
Dim osVersionBinding As New Binding("text", DeviceBindingSource, "Operating_System_Version")
OsVersionTextBox.DataBindings.Add(osVersionBinding)
Dim priceBinding As New Binding("text", DeviceBindingSource, "Price")
PriceTextBox.DataBindings.Add(priceBinding)
End Sub
Private Sub ToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton1.Click
DeviceBindingSource.EndEdit()
Dim tabletCommandBuilder As New OleDbCommandBuilder(tabletDataAdapter)
tabletDataAdapter.InsertCommand = tabletCommandBuilder.GetInsertCommand()
tabletDataAdapter.DeleteCommand = tabletCommandBuilder.GetDeleteCommand()
tabletDataAdapter.UpdateCommand = tabletCommandBuilder.GetUpdateCommand()
Dim numOfRecords As Integer = tabletDataAdapter.Update(tabletDataSet, "Device")
MsgBox(numOfRecords & " records have been updated.")
End Sub
End Class
【问题讨论】:
【参考方案1】:尽管您已经从表单设计和数据绑定的角度提出了问题,但您需要先回过头来对数据模型进行一些更改。您的数据模型存在一些基本问题,这将使您的应用程序难以构建。解决这些问题后,您应该会发现构建表单和操作数据会容易得多。
目前除了 [Device] 之外的所有表都有一个 [Device_ID] 外键,它指向 [Device] 表中的相关记录。这使得 [Device] 表成为 Parent 而另一个表成为 Child,这种关系的本质是母亲(父母)可以有多个孩子,但只有一个孩子只能有一个妈妈。在您的情况下,这种关系对于您现在的表格并不总是有意义。
问题:[Physical_Specs] 作为子表
将 [Physical_Specs] 作为子表是没有意义的。 [Color]、[Weight] 等属性应该在 [Device] 表中,因为每个设备的每个属性只能有一个值(例如,一个设备只能有一个 [Weight])。此外,将 [颜色]、[高度]、[宽度]、[重量] 的所有可能组合保存在单独的参考表中以供其他设备重复使用并没有真正的好处。
您应该考虑将 [Connectivity] 和 [Storage] 属性也合并到 [Device] 表中是否有意义。
问题:[屏幕]作为子表
当 [Screen] 是子表时,您必须为每个 [Device] 维护单独的 [Screen] 记录,如果多个设备使用同一屏幕,则您必须在 [Screen] 中复制该信息桌子。那是倒退。实际上,一个屏幕(OEM 部分)可以被许多设备使用,但任何给定的设备都只有一个屏幕。您当前数据模型的设置方式正好相反:一个设备(父)可以有多个屏幕(子),但一个屏幕记录(子)只能有一个父记录。
[Device] 表应该有一个指向相应 [Screen] 记录的 [Screen_ID] 外键,而不是 [Screen] 中的 [Device_ID] 外键。这允许多个设备引用相同的 [Screen] 记录,并且每个设备将只有一个这样的引用(即,每个设备将只有一个屏幕)。
我在这里单独列出了 [Screen],但同样的推理也适用于 [Battery] 和 [Camera] 表。
没问题:[Pictures] 和 [Reviews] 作为子表
正如您为这些表指定的复数名称所暗示的那样,将它们作为子表确实有意义,因为您可以为给定产品提供多张图片或评论,并且每张图片或评论将指向单个设备。
【讨论】:
感谢我提交了您推荐的更改,但现在我的绑定添加项和删除按钮不起作用我收到 SQL 错误以上是关于绑定多个表格的按钮的主要内容,如果未能解决你的问题,请参考以下文章
带有按钮的表格上的敲除映射和 foreach 数据绑定,缺少对视图模型的引用?
bootstarp-table表格中嵌套多个BUTON按钮实现