none
兩個Form之間,資料DataRelation的問題 RRS feed

  • 問題

  • 作業系統:WinXP Pro SP3

    開發工具:VS2005,VB.NET

    問題:

    1. 當Form被Close之後,是完全不存在嗎?(連記憶體裡都沒);

     

    2. Dispose是執行什麼樣的動作(我看他提供的說明不是很明白)?我不知道當Form Close的時候,執行Form.Dispose是否有意義?

     

    3. 假設有Form1及Form2,Form1是訂單資料,Form2是訂單明細,(兩個都用DataGrid顯示),BindingKey為訂單編號,當Form1的訂單資料(DataGrid)的Record移動時,Form2會自動列出相關的訂單明細,這該怎麼設定?

    我在同一個Form上面試過,一開始訂單明細的DataGrid會列出第一筆訂單的明細資料,但是當我移動訂單的Record時,訂單明細就不會跟著跑了.

     

    4. 如果DataSet的資料是由兩個資料表Join出來的,那是否就不能執行Update?我的資料來源有設定是Daset1,兩個資料表,Test1及Test2,Test1是兩個資料表Join起來的.寫Code的時候,可以下Test2.t2TableAdapter.Update()

    但是Test1.t1TableAdapter.卻不會列出Update()

    是否還是要自己下SQLCommand?

     

     

    ===以下為第3個問題的Code===

    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            '連結資料庫
            Dim connectionString As String = "Provider=Microsoft.Jet.Oledb.4.0;Data source=test.mdb"
            Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(connectionString)
            conn.Open()

            '查詢資料
            Dim str1 As String = "SELECT * FROM tbOrder"

          Dim str2 As String = "SELECT * FROM tbOrderDetail"

            Dim adp1 As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(str1, conn)
            Dim adp2 As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(str2, conn)
            
            Dim ds1 As DataSet = New DataSet
            adp1.Fill(ds1, "tbOrder")
            adp2.Fill(ds1, "tbOrderDetail")

          Dim tbOrderColumn As DataColumn
            Dim tbOrderDetailColumn As DataColumn
            tbOrderColumn = ds1.Tables("tbOrder").Columns("ordernum")
            tbOrderDetailColumn = ds1.Tables("tbOrderDetail").Columns("ordernum")
            Dim idx_ordernumAs Data.DataRelation
            idx_ordernum= New Data.DataRelation("idx_ordernum", tbOrderColumn, tbOrderDetailColumn , False)
            ds1.Relations.Add(idx_ordernum)
            DataGrid1.DataSource = ds1.Tables("tbOrder")
            DataGrid2.SetDataBinding(ds1, "tbOrderDetail.idx_ordernum")

           
            conn.Close()

        End Sub

    End Class

    ==以上為Code==
    • 已移動 璉璉Moderator 2010年1月24日 上午 03:44 (從:Visual Studio一般討論區(General))
    2007年5月20日 下午 03:16

解答

  • 我都是用Object 去 Binding 而我目前都用 WPF在做,所以語法不是很熟了,當應該不會差太多了,所以要請版上其他的大大解了.
    2007年5月21日 上午 02:13

所有回覆

  • 這是標準的Master-Detail 的問題,也是很多人常問的問題集,一般的市售書好像也很少教.

    1.Form.Close 後,如果該 Form 不是靜態變數,也不是主 Form 的話就會等待由GC回收.

    2.Dispose一般是不用做,除非你有用到Unmanaged Code 就要在這裡將GC不能回收的資源釋放掉.

    3.在Form1,Form2的DataBindingControl,Binding 到同一個 DataSet 就行了.

    4.UpDateCommand 需自己寫.

    5.Code 看起來沒問題,你要問甚麼.

    2007年5月21日 上午 12:28
  • 感謝回覆~

    Code執行是沒有錯誤訊息,只是可惜沒有產生出我期望的結果.就是Form開啟之後,一開始訂單明細的DataGrid會列出第一筆訂單的明細資料,但是當我再點選訂單的其他Record時,訂單明細就不會跟著顯示出相對應的資料.

    您回覆說.DataBindingControl,Binding 到同一個 DataSet 就行了.

    那我Code裡面的這樣子寫.

    DataGrid1.DataSource = ds1.Tables("tbOrder")
      DataGrid2.SetDataBinding(ds1, "tbOrderDetail.idx_ordernum")

    為什麼DataGrid2還的內容還是不會因為DataGrid1移動Record而改變資料呢?

    2007年5月21日 上午 01:53
  • 我都是用Object 去 Binding 而我目前都用 WPF在做,所以語法不是很熟了,當應該不會差太多了,所以要請版上其他的大大解了.
    2007年5月21日 上午 02:13
  • 謝謝你~

    我繼續試看看~

    (網路上關於DataRelation的範例及說明似乎挺少的)

    2007年5月21日 上午 02:45
  • 若是在同一個Form上,DataGrid1(顯示Order),DataGrid2(顯示OrderDetail)

    選擇DataGrid2的DataSource時,自然會將DataGrid1的BindingResource所關聯的OrderOrderDetail顯示出來.所以點選之後,就可以達到點選DataGrid1的Order資料,DataGrid2的OrderDetail資料自然跟著移動.

     

    但是若DataGrid2在Form2時,選擇DataGrid2的DataSource時,並不會有DataGrid1的BindingResource可以選擇.所以怎麼試都不能達到上述的效果..

    2007年5月21日 上午 09:27