Dim DataSet1 As New DataSet '建表等略
Dim ComboBox1 As New ComboBox
ComboBox1.DropDownStyle = ComboBoxStyle.DropDown
ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems
ComboBox1.AutoCompleteMode = AutoCompleteMode.Suggest
'組合框的資料源
Dim DataTable1 As DataTable = DataSet1.Tables("商品表")
Dim DataView1 As New DataView
DataView1.Table = DataTable1
ComboBox1.DataSource = DataView1
ComboBox1.DisplayMember = "名稱"
ComboBox1.ValueMember = "編碼"
'系結
Dim DataTable2 As DataTable = DataSet1.Tables("業務表")
Dim DataView2 As New DataView
DataView2.Table = DataTable2
Dim BindingSource2 As New BindingSource
BindingSource2.DataSource = DataView2
ComboBox1.DataBindings.Add("SelectedValue", BindingSource2, "編碼", True, DataSourceUpdateMode.OnPropertyChanged)
'表單上的操作
ComboBox1.Text = ""
ComboBox1.SelectedIndex = -1
Dim Cnn1 As New System.Data.OleDb.OleDbConnection '連接略
Dim OleDbDataAdapter1 As New System.Data.OleDb.OleDbDataAdapter
OleDbDataAdapter1.SelectCommand = New System.Data.OleDb.OleDbCommand
OleDbDataAdapter1.SelectCommand.Connection = Cnn1
OleDbDataAdapter1.SelectCommand.CommandType = CommandType.Text
OleDbDataAdapter1.SelectCommand.CommandText = "Select 商品表.* From 商品表"
OleDbDataAdapter1.Fill(DataSet1, "商品表") 'RowChanged 事件中,仍然正常
'這里出現,ComboBox1自動選擇了下拉串列的第一項
上述程式段是專門寫上來的,不是完整代碼,不必計較。主要問題在于,從資料庫重新讀入組合框的資料源表,為什么會導致組合框自動選擇?
由于資料源表是多個表單多個組合框的公共資料源表,也從來不使用 RaiseListChangedEvents = False 這類處理辦法,請各位指點一下原因所在,及解決辦法,請使用 VB.Net解答,多謝!
uj5u.com熱心網友回復:
保存選項序列下次使用,系結后處理。uj5u.com熱心網友回復:
我要的就是組合框空值,并不需要保存任何選項序列,并且已經是系結。uj5u.com熱心網友回復:
Option Explicit OnPublic Class ClassDataGridView1
Inherits Form
'測驗用表單
Private Button2 As Button, ComboBox2 As ComboBox, BindingSource2 As BindingSource
Sub New()
ComboBox2 = New ComboBox
ComboBox2.DropDownStyle = ComboBoxStyle.DropDown
ComboBox2.AutoCompleteSource = AutoCompleteSource.ListItems
ComboBox2.AutoCompleteMode = AutoCompleteMode.Suggest
'組合框的資料源
Dim DataTable1 As DataTable = DataSetVS.Tables("Goods") '建一個資料庫表,只要有這兩列:GdGoodsSerial、GdGoodsName
Dim DataView1 As New DataView
DataView1.Table = DataTable1
ComboBox2.DataSource = DataView1
ComboBox2.DisplayMember = "GdGoodsName"
ComboBox2.ValueMember = "GdGoodsSerial"
'系結
Dim DataTable2 As DataTable = DataSetVS.Tables("BOMStruct") '建一個資料庫表,只要有這一列:BSGoodsNum
Dim DataView2 As New DataView
DataView2.Table = DataTable2
BindingSource2 = New BindingSource
BindingSource2.DataSource = DataView2
ComboBox2.DataBindings.Add("SelectedValue", BindingSource2, "BSGoodsNum", True, DataSourceUpdateMode.OnPropertyChanged)
Button2 = New Button
AddHandler Button2.Click, AddressOf Button2Click
AddHandler Me.Shown, AddressOf Me.Shown1
End Sub
Private Shadows disposed As Boolean = False
Protected Overrides Sub Dispose(disposing As Boolean)
If Not Me.disposed Then
If disposing = True Then
Button2.Dispose()
ComboBox2.Dispose()
End If
End If
Me.disposed = True
MyBase.Dispose(disposing)
End Sub
Protected Overrides Sub Finalize()
Me.Dispose(False)
End Sub
Private Sub Shown1(FormN As Form, e As EventArgs)
Me.FormBorderStyle = FormBorderStyle.SizableToolWindow
Me.WindowState = FormWindowState.Maximized
Button2.Size = New Size(100, 25)
Button2.Location = New Point(0, 100)
Me.Controls.Add(Button2)
ComboBox2.Size = New Size(200, 25)
ComboBox2.Location = New Point(0, 200)
Me.Controls.Add(ComboBox2)
End Sub
Private Sub Button2Click(sender As Object, e As System.EventArgs)
ComboBox2.Text = ""
ComboBox2.SelectedIndex = -1
Dim Cnn1 = New System.Data.OleDb.OleDbConnection '創建連接即可
Dim OleDbDataAdapter1 As New System.Data.OleDb.OleDbDataAdapter
OleDbDataAdapter1.SelectCommand = New System.Data.OleDb.OleDbCommand
OleDbDataAdapter1.SelectCommand.Connection = Cnn1
OleDbDataAdapter1.SelectCommand.CommandType = CommandType.Text
OleDbDataAdapter1.SelectCommand.CommandText = "Select Goods.* From Goods"
OleDbDataAdapter1.Fill(DataSetVS, "Goods")
'這里出現,ComboBox1自動選擇了下拉串列的第一項
End Sub
End Class
uj5u.com熱心網友回復:
上面附了代碼,只要建兩個簡單表就可以測驗。請施以援手!請快uj5u.com熱心網友回復:
重新系結,控制元件狀態也會重設的,有資料么默認就是選第一條了,如果不想選中,系結完了再把選項Index設為-1即可。uj5u.com熱心網友回復:
一個公共表,是會被多個表單多個組合框用作資料源的。例如,有這樣的兩個組合框分別在不同的表單被用戶輸入為 .Text = "",然后用戶再打開一個表單從而重繪該公共表,這時,被用戶遺忘的兩個組合框,就會在用戶不知情的情況下被自動賦值,然后用戶可能直接保存,這樣就可能導致錯誤資料。
而如果,如二樓和五樓所說,要把這兩個組合框都重新系結,那么程式的邏輯就是:任何表重繪時,將檢查所有表單,找出使用該公共表作為資料源的組合框,將空值的組合框作記錄,待公共表重繪以后,再逐一重新系結,再設定SelectedIndex = -1(其實在這里,必須設定SelectedValue = DBNull.Value,否則不需要重繪表,僅僅是關聯控制元件之間操作空值就會導致上述問題),這樣從問題現象上面去反復處理一個不必要的欄位值,有沒有從根本上處理的辦法?
現在已經逐句排查出來原因,是因為 OleDbDataAdapter1.FillLoadOption = LoadOption.PreserveChanges 這一句導致,但是怎樣解決?
uj5u.com熱心網友回復:
另外說明一下,控制元件是不斷開下拉串列的資料源,及控制元件本身保持系結,因為已經過測驗,無論系結與否,上述問題一樣出現。uj5u.com熱心網友回復:
combobox SelectedIndexChanged的事件中加下面3行代碼試試If Me.IsHandleCreated = False Then
Exit Sub
End If
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/11511.html
標籤:VB.NET
