none
2 個 Combobox 綁定與顯示問題。 操作其中一個 Combobox,另一個 Combobox 也跟著動起來 RRS feed

  • 問題

  • 我是 Access 2003 + VB2008,程式作了 2 個 ComBobox 控制元件和 1 個資料表,
    2 個 ComBoBox 繫結完,操作其中一個 ComBobox 控制元件時另一個 ComBobox  控制元件也會跟著動起來,怎麼會這樣?


    資料表配置如下;

    物業(Table1)---
    識別碼(Column1)數字,自動編號,主鍵
    大樓住址(Column2)字串
    大樓名稱(Column3)字串
    房客序號(Column4)數字

    我使用 SQL 的 Select From 語句篩選出資料欄位,再用 DataSet + DataTable 分別與 2 個 ComBoBox.DateSource 綁定,用 
    ComBoBox.DisplayMember 顯示出來,
    於 Form_Load 下配置程式碼 :

    Imports System.Data.OleDb
    
    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\aa1.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "Select 大樓名稱 from 物業 "
            Dim adp1 As OleDbDataAdapter = New OleDbDataAdapter(str1, conn)
    
            Dim set1 As DataSet = New DataSet
            adp1.Fill(set1, "物業")
    
            Dim table1 As DataTable = New DataTable
            table1 = set1.Tables("物業")
    
            ComboBox1.DataSource = table1
            ComboBox1.DisplayMember = "大樓名稱"
            ComboBox1.SelectedIndex = -1
    
            ComboBox2.DataSource = table1
            ComboBox2.DisplayMember = "大樓名稱"
            ComboBox2.SelectedIndex = -1
    
            conn.Close()
        End Sub
    End Class

    • 已編輯 C.Kevin 2012年5月28日 上午 03:57
    2012年5月28日 上午 03:53

解答

  • ComboxBox.DataSource 只是一個導向性的資料,所以當 ComboBox1 和 ComboBox2 都是指向相同的 Table1,那 DB Cursor 也跟著跳到相同的地方

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    • 已提議為解答 Angusruby 2012年5月28日 上午 04:50
    • 已標示為解答 C.Kevin 2012年5月28日 上午 05:05
    • 已取消標示為解答 C.Kevin 2012年5月28日 上午 05:20
    • 已標示為解答 C.Kevin 2012年5月28日 上午 07:03
    2012年5月28日 上午 04:14
  • 你是否用了同一個DataAdapter?你要兩個dataadapter。如果你只是顯示所有data,建議你用兩個 DataReader

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    • 已標示為解答 C.Kevin 2012年5月28日 上午 07:03
    2012年5月28日 上午 06:16
  • 另一個方式:

    你可以直接用 DataTable.Copy 方法在記憶體中複製一份 DataTable, 就不用 Execute兩次 DataReader 了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年5月30日 上午 12:31
    2012年5月28日 下午 02:37
    版主

所有回覆

  • ComboxBox.DataSource 只是一個導向性的資料,所以當 ComboBox1 和 ComboBox2 都是指向相同的 Table1,那 DB Cursor 也跟著跳到相同的地方

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    • 已提議為解答 Angusruby 2012年5月28日 上午 04:50
    • 已標示為解答 C.Kevin 2012年5月28日 上午 05:05
    • 已取消標示為解答 C.Kevin 2012年5月28日 上午 05:20
    • 已標示為解答 C.Kevin 2012年5月28日 上午 07:03
    2012年5月28日 上午 04:14
  • 原來是這樣~
    謝謝 KenLin ~
    2012年5月28日 上午 05:06
  • 抱歉取消了答案,是因為我碰到了點狀況,

    我新設了 DataSet、DataTable 變數給另一個 ComboBox 沒辦法解決問題,
    怎麼做能解決問題呢?

    2012年5月28日 上午 05:25
  • 你是否用了同一個DataAdapter?你要兩個dataadapter。如果你只是顯示所有data,建議你用兩個 DataReader

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    • 已標示為解答 C.Kevin 2012年5月28日 上午 07:03
    2012年5月28日 上午 06:16
  • 我用了 2 個 DataAdapter,現在改成使用 DataReader 了。
    DataReader 與 DataTable 都各用 2 個。
    謝謝
    KenLin ~

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim table1, table2 As DataTable
    Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\aa1.mdb"

    Dim conn As OleDbConnection = New OleDbConnection(str) conn.Open() Dim str1 As String = "Select 大樓名稱 from 物業 " Dim cmd As OleDbCommand = New OleDbCommand(str1, conn) Dim read As OleDbDataReader = cmd.ExecuteReader table1 = New DataTable table1.Load(read) ComboBox1.DataSource = table1 ComboBox1.DisplayMember = "大樓名稱" ComboBox1.SelectedIndex = -1 Dim read1 As OleDbDataReader = cmd.ExecuteReader table2 = New DataTable table2.Load(read1) ComboBox2.DataSource = table2 ComboBox2.DisplayMember = "大樓名稱" ComboBox2.SelectedIndex = -1 conn.Close() End Sub



    • 已編輯 C.Kevin 2012年5月28日 上午 07:03
    2012年5月28日 上午 07:02
  • 另一個方式:

    你可以直接用 DataTable.Copy 方法在記憶體中複製一份 DataTable, 就不用 Execute兩次 DataReader 了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年5月30日 上午 12:31
    2012年5月28日 下午 02:37
    版主
  • To Bill :

    你的建議也滿簡單的,謝謝。

    	Dim table1, table2 As DataTable
    	Dim str As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=C:\aa1.mdb"
            Dim conn As OleDbConnection = New OleDbConnection(str)
            conn.Open()
    
            Dim str1 As String = "Select 大樓名稱 from 物業 "
            Dim cmd As OleDbCommand = New OleDbCommand(str1, conn)
            Dim read As OleDbDataReader = cmd.ExecuteReader
    
            table1 = New DataTable
            table1.Load(read)
    
            ComboBox1.DataSource = table1
            ComboBox1.DisplayMember = "大樓名稱"
            ComboBox1.SelectedIndex = -1
    
    
            table2 = table1.Copy
            
    ComboBox2.DataSource = table2 ComboBox2.DisplayMember = "大樓名稱" ComboBox2.SelectedIndex = -1 conn.Close()

    • 已編輯 C.Kevin 2012年5月30日 上午 12:32
    2012年5月30日 上午 12:30