none
請問有沒有方法可以將兩個DataGridView互相作關聯的動作呢? RRS feed

  • 問題

  • 請問如果在一個Form下有兩個DataGridVeiw,各為LefmanDataGridView和RightmanDataGridView

    LefmanDataGridView所要出現的畫面為:部門代號/部門名稱

    RightmanDataGridView所要出現的畫面為:員工代號/姓名

     

    但因為RightmanDataGridView的索引是由LefmanDataGridView裡的部門代號來移動的。

    所以一開始想說先將,部門代號/員工代號/姓名,由資料庫抓進來,

    再來用man這個變數來設定為LefmanDataGridView的部門代號,

    然後再定義RightmanDataGridView裡的部門代號為man,

    想說這樣的話,當移動左邊的游標的時候,右邊的也會跟著移動,

    但是.....我想的太天真了,這樣是不行的...

    請問要怎麼寫才能讓左邊的LeftmanDataGridView移動時,

    右邊的RightmanDataGridView也會跟著它的資料而移動呢???

    以下是我目前寫的程式,但是沒有成功.....

    程式碼區塊

    Private Sub Deptman_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim cn As New SqlClient.SqlConnection("server=.;database=cmms1;uid=sa;password=sescsapw")
            Dim cmd As New SqlClient.SqlCommand
            Dim da As New SqlClient.SqlDataAdapter
            Dim ds As New DataSet
            Dim Leftmanda As New SqlDataAdapter("SELECT  Distinct DepNo AS 部門代號, DepName AS 部門名稱 FROM  dbo.C_Dept", cn)
            Leftmanda.Fill(ds, "Leftman")
            LeftmanDataGridView.DataSource = ds.Tables("Leftman")
            Dim Rightmanda As New SqlDataAdapter("SELECT   TOP 100 PERCENT C_Dept.DepNo AS 部門代號, A_DeptMan.ManID As 員工代號,A_DeptMan.ManName AS 姓名 FROM A_DeptMan INNER JOIN C_Dept ON A_DeptMan.DepNo = C_Dept.DepNo", cn)
            Rightmanda.Fill(ds, "Rightman")
            RightmanDataGridView.DataSource = ds.Tables("Rightman")
            Dim man As Object
            man = LeftmanDataGridView.Rows(0).Cells(0).Value
            If LeftmanDataGridView.Rows(0).Cells(0).Value Then
                RightmanDataGridView.Rows(0).Cells(0).Value = man
                RightmanDataGridView.Columns("部門代號").Visible = False
            End If

     

     

    2007年12月6日 上午 08:33

解答

  • HI,

     

    您可以兩種方法建立DataSet中兩個DataTable之間的關聯:

     

    1) 利用DataSet的編輯視窗, 使用滑鼠連接兩個DataTable之間的關聯欄位

    2) 利用DataRelation類別建立兩個DataTable之間的關聯, 例如: 

        DataSet物件.Relations.Add(“FK_CustomersOrders”,  DataSet物件.Tables("Customers").Columns("CustID"), _
     .                                            DataSet物件.Tables("Orders").Columns("CustID"), True)

    tihs

    2007年12月8日 下午 12:56

所有回覆

  • HI,

     

    這個問題您不是問過了嗎? 您不要寫程式去控制會比較簡單, 請參考:

     

    http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2483883&SiteID=14

     

    tihs

    2007年12月6日 上午 09:04
  • Hi  tihs

    首先這個問題和上次問的是一樣的沒錯,也試過之前的作法,但是

    如果直接從精靈抓DataSet進來的話,兩個DataGridView是可以有關聯的動作,

    不過,這樣的話,就沒辦法在左邊的DataGridView,作排除重覆的動作,

    因為在Select寫了Distinct的時候,也會連後面的資料,跟著作

    那麼在DataGridView1出現的畫面,就沒有排除重覆的資料了,

    因為會被後面的資料給影響到。

    ex:同一個部門,不可能只有一個人,一定有很多的人組成,

    那麼1部門,就會出現不同的姓名出現。

    所以才想說用程式來寫,設定看是否能達成這個動作......

    這樣能懂我的意思嗎?

    不懂的話,我在想辦法說明.....

     

     

    2007年12月6日 上午 09:29
  • HI,

     

    請問您是如何做Distinct的? 應該是左方的Table做Distinct就可以了

     

    tihs

    2007年12月7日 上午 02:22
  • Hi  tihs

    我從精靈將兩個Tables抓到DataSet,但這兩個並不會自動產生關聯的階層關係,

    也試過去自已將它們作關聯的動作,但沒辦法成功。

     

    所以才想說將要的資料全都先放在同一個Table,

    再去將它們拆成兩個DataGridView,這樣就可以像有關聯一樣的互動,

    但是........我想的太天真了,

    這樣的話,我在設Distinct,部門代號就不會出現我要的排除重覆的資料

    因為會被後面的資料所影響。

     

    2007年12月7日 上午 07:29
  • HI,

     

    您可以兩種方法建立DataSet中兩個DataTable之間的關聯:

     

    1) 利用DataSet的編輯視窗, 使用滑鼠連接兩個DataTable之間的關聯欄位

    2) 利用DataRelation類別建立兩個DataTable之間的關聯, 例如: 

        DataSet物件.Relations.Add(“FK_CustomersOrders”,  DataSet物件.Tables("Customers").Columns("CustID"), _
     .                                            DataSet物件.Tables("Orders").Columns("CustID"), True)

    tihs

    2007年12月8日 下午 12:56
  • Hi  tihs

    Dim relLeftRight As DataRelation
            relLeftRight = New DataRelation("LiftRight", LeftColumn, RightColumn)

    出現錯誤訊息----->父資料行和子資料行沒有型別相符的資料行。

     

    我查了一下SQL資料庫,父與子的資料型別,

    父原本為smallint,子原本為int

    後來我試著到SQL將父也改為int,再重新測試,還是不行,

    請問有辦法用程式,將原本的父資料庫的那一行型別改為int嗎?

    如果可以改的話,可否也附上參考,讓我知道怎麼改呢??....................謝謝!!

     

    附上我父、子的Table,欄位

    Dim LeftColumn As DataColumn = CMMS1DataSet.Tables("Leftman").Columns("部門代號")...................父
    Dim RightColumn As DataColumn = CMMS1DataSet.Tables("Rightman").Columns("部門代號")...............子

    2007年12月10日 上午 01:22
  • HI,

     

    您將資料庫中父Table的欄位型態改成int之後, 有沒有重新建立DataSet? 如果有, 可以從VS2005開啟DataSet檔案(副檔名為XSD), 檢視DataSet中的父Table的欄位型態已改變

     

    tihs

    2007年12月10日 上午 07:13