Vb.net 将额外项添加到数据绑定组合框中,vb.net,data-binding,combobox,Vb.net,Data Binding,Combobox,我试图在与数据库绑定后将一个项目添加到组合框中,以便组合框可以具有如下内容:
组合框
值1
值2
价值3
尝试使用下面的代码,但我收到错误“设置DataSource属性时无法修改Items集合。”它不允许我在组合框绑定后添加其他项。如何使用绑定的组合框向组合框中添加额外的项目
Public Overloads Sub SqLoadCombo2(ByVal comboBox As ComboBox, ByVal cnnStr As String, ByVal TextField As Strin
值1
值2
价值3
尝试使用下面的代码,但我收到错误“设置DataSource属性时无法修改Items集合。”它不允许我在组合框绑定后添加其他项。如何使用绑定的组合框向组合框中添加额外的项目
Public Overloads Sub SqLoadCombo2(ByVal comboBox As ComboBox, ByVal cnnStr As String, ByVal TextField As String, ByVal ValueField As String, ByVal sAdditionalText As String, ByVal sAdditionalValue As String, ByVal sTextSeperator As String, ByVal sAdditionalTextDirection As String)
comboBox.Items.Clear()
Dim sAddText() As String
Dim sAddValue() As String
Dim iAddSize As Integer
Dim iCtr As Integer
Dim conn As New SqlConnection("SERVER=192.168.168.200,1433;DATABASE=WBIS_Laos;UID=BISSKG;PWD=BISSKG;Asynchronous Processing=false;")
Dim strSQL As String = cnnStr
Dim da As New SqlDataAdapter(strSQL, conn)
Dim ds As New DataSet
da.Fill(ds, "Disk")
With comboBox
.DataSource = ds.Tables("Disk")
.DisplayMember = TextField
.ValueMember = ValueField
.SelectedIndex = 0
End With
'==Retrieve Additional Text and Value==
If sAdditionalText.ToString <> "" Then
sAddText = sAdditionalText.Split(sTextSeperator)
sAddValue = sAdditionalValue.Split(sTextSeperator)
iAddSize = sAddText.Length
Else
ReDim sAddText(0)
ReDim sAddValue(0)
iAddSize = 0
End If
'**Retrieve Additional Text and Value**
'==Push Additional text into combo based on the direction request==
sAdditionalTextDirection = sAdditionalTextDirection.ToString.Trim.ToUpper
If sAdditionalTextDirection <> "TOP" And sAdditionalTextDirection <> "BTM" Then
sAdditionalTextDirection = "TOP"
End If
If sAdditionalTextDirection = "BTM" Then
For iCtr = 0 To iAddSize - 1
comboBox.Items.Add(sAddText(iCtr))
comboBox.Items(comboBox.Items.Count - 1).Value = sAddValue(iCtr)
Next
Else
For iCtr = iAddSize - 1 To 0 Step -1
comboBox.Items.Insert(0, sAddText(iCtr))
comboBox.Items(0).Value = sAddValue(iCtr)
Next
End If
End Sub
Public重载子SqLoadCombo2(ByVal comboBox作为组合框,ByVal cnnStr作为字符串,ByVal TextField作为字符串,ByVal ValueField作为字符串,ByVal sAdditionalText作为字符串,ByVal sAdditionalValue作为字符串,ByVal stextseparator作为字符串,ByVal sAdditionalTextDirection作为字符串)
comboBox.Items.Clear()
将文本()设置为字符串
将值()设置为字符串
Dim iAddSize为整数
作为整数的Dim-iCtr
Dim conn作为新的SqlConnection(“SERVER=192.168.168.2001433;DATABASE=WBIS\u Laos;UID=BISSKG;PWD=BISSKG;异步处理=false;”)
作为字符串的Dim strSQL=cnnStr
Dim da作为新的SqlDataAdapter(strSQL,conn)
Dim ds作为新数据集
da.填充(ds,“磁盘”)
带组合框
.DataSource=ds.Tables(“磁盘”)
.DisplayMember=TextField
.ValueMember=ValueField
.SelectedIndex=0
以
'==检索其他文本和值==
如果sAdditionalText.ToString“”则
sAddText=sAdditionalText.Split(StextSeparator)
sAddValue=sAdditionalValue.Split(StextSeparator)
iAddSize=sAddText.Length
其他的
重拨文本(0)
ReDim值(0)
iAddSize=0
如果结束
'**检索其他文本和值**
'==根据方向请求将其他文本推入组合框==
sAdditionalTextDirection=sAdditionalTextDirection.ToString.Trim.touper
如果sAdditionalTextDirection“TOP”和sAdditionalTextDirection“BTM”,则
sAdditionalTextDirection=“顶部”
如果结束
如果sAdditionalTextDirection=“BTM”,则
卢旺达问题国际法庭=0至iAddSize-1
组合框.项目.添加(文本(卢旺达问题国际法庭))
comboBox.Items(comboBox.Items.Count-1).Value=sAddValue(iCtr)
下一个
其他的
卢旺达问题国际法庭=iAddSize-1至0步骤-1
组合框.项目.插入(0,文本(卢旺达问题国际法庭))
comboBox.Items(0).Value=SADD值(iCtr)
下一个
如果结束
端接头
无需将组合框绑定到数据适配器
只需从头开始创建自己的数据表
——首先用要添加到列表中的字段填充表格,然后通过阅读器循环将每个项添加到数据表
。在此之后,您可以将表绑定到组合框。
下面是我使用的一个例子
Dim sqlHardware As String = "SELECT * FROM Hardware ORDER BY HardwareType"
Dim dtHardware As New DataTable, drHardware As DataRow
dtHardware.Clear()
dtHardware.Columns.Add(New DataColumn("ID", GetType(String))) '1
dtHardware.Columns.Add(New DataColumn("HardwareType", GetType(String))) ' 2
Dim commandHardware As New SqlCommand(sqlHardware, ConnMVC)
If ConnMVC.State <> 1 Then ConnMVC.Open()
Dim readerHardware As SqlDataReader = commandHardware.ExecuteReader()
If readerHardware.HasRows Then
drHardware = dtHardware.NewRow()
drHardware(0) = "0"
drHardware(1) = "Select Type"
dtHardware.Rows.Add(drHardware)
Do While readerHardware.Read
drHardware = dtHardware.NewRow()
drHardware(0) = readerHardware!ID
drHardware(1) = readerHardware!HardwareType
dtHardware.Rows.Add(drHardware)
Loop
cbSoortHardware.DataSource = dtHardware
cbSoortHardware.DisplayMember = "SoortHardware"
cbSoortHardware.ValueMember = "ID"
cbSoortHardware.SelectedIndex = 0
End If
Dim sqlHardware As String=“按硬件类型从硬件订单中选择*
Dim dtHardware作为新数据表,drHardware作为数据行
dtHardware.Clear()
dtHardware.Columns.Add(新数据列(“ID”,GetType(字符串)))'1
添加(新数据列(“HardwareType”,GetType(String)))'2
Dim commandHardware作为新的SqlCommand(sqlHardware,ConnMVC)
如果ConnMVC.State为1,则ConnMVC.Open()
Dim readerHardware作为SqlDataReader=commandHardware.ExecuteReader()
如果readerHardware.HasRows,则
drHardware=dtHardware.NewRow()
dr硬件(0)=“0”
drHardware(1)=“选择类型”
dtHardware.Rows.Add(drHardware)
边读边读硬件
drHardware=dtHardware.NewRow()
drHardware(0)=读卡器硬件!身份证件
drHardware(1)=读卡器硬件!硬件类型
dtHardware.Rows.Add(drHardware)
环
cbsoorhardware.DataSource=dtHardware
cbSoortHardware.DisplayMember=“SoortHardware”
cbSoortHardware.ValueMember=“ID”
cbsoorhardware.SelectedIndex=0
如果结束
我使用BindingSource对象,将其连接到源列表,然后将其键入组合框。
所有操作都会被传输到源并刷新到组合框。
下面是一个带有组合框和按钮的简单示例:
Public Class Form1
Dim CoupledOrder As New List(Of clsCoupledOrder)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim cOrder As clsCoupledOrder
cOrder = New clsCoupledOrder("1", "Sunday")
CoupledOrder.Add(New clsCoupledOrder("1", "Sunday"))
CoupledOrder.Add(New clsCoupledOrder("2", "Monday"))
CoupledOrder.Add(New clsCoupledOrder("3", "Tuesday"))
CoupledOrder.Add(New clsCoupledOrder("4", "Wednesday"))
CoupledOrder.Add(New clsCoupledOrder("5", "Thursday"))
CoupledOrder.Add(New clsCoupledOrder("6", "Friday"))
CoupledOrder.Add(New clsCoupledOrder("7", "Saturday"))
BindingSource1.DataSource = New BindingSource(CoupledOrder, Nothing)
ComboBox1.DataSource = BindingSource1
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Description"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim AddValue As clsCoupledOrder = New clsCoupledOrder("8", "ExtraDay")
BindingSource1.List.Insert(0, AddValue)
End Sub
Private Sub BindingSource1_CurrentChanged(sender As Object, e As EventArgs) Handles BindingSource1.CurrentChanged
End Sub
末级
Public Class clsCoupledOrder
Private StringDesc As String
Private GUID As String
Public Sub New(ByVal desc As String, ByVal value As String)
Me.StringDesc = desc
Me.GUID = value
End Sub
Public Property Description() As String
Get
Return StringDesc
End Get
Set(ByVal value As String)
StringDesc = value
End Set
End Property
Public Property Value() As String
Get
Return GUID
End Get
Set(ByVal value As String)
GUID = value
End Set
End Property
结束类我的解决方案是在表的顶部添加一个新行
Public Class clsCoupledOrder
Private StringDesc As String
Private GUID As String
Public Sub New(ByVal desc As String, ByVal value As String)
Me.StringDesc = desc
Me.GUID = value
End Sub
Public Property Description() As String
Get
Return StringDesc
End Get
Set(ByVal value As String)
StringDesc = value
End Set
End Property
Public Property Value() As String
Get
Return GUID
End Get
Set(ByVal value As String)
GUID = value
End Set
End Property
之后
da.Fill(ds,“磁盘”)
插入以下代码:
Dim dr As DataRow = ds.Tables("Disk").NewRow
dr(ValueField) = -1 ' NB :use dr(0) in others situation see example
dr(TextField) = "< Select Option >" ' NB :use dr(1) in others situation see example
ds.Tables("Disk").Rows.InsertAt(dr, 0) ' Insert the new row to datatable's top