none
WPF的DataGrid如何Binding有Releation的DataSet RRS feed

  • 問題

  • 我的資料庫就這樣而已

    我想要的效果是DataGrid去Binding ChildData,但是其中有一個欄位要透過Releation去取得ParentName

    我的程式碼:

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:ParentApplication" x:Class="ParentApplication.MainWindow"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Window.Resources>
            <local:DataSetTE x:Key="dataSetTE"/>
            <CollectionViewSource x:Key="childDataViewSource" Source="{Binding ChildData, Source={StaticResource dataSetTE}}"/>
            <CollectionViewSource x:Key="childDataViewSource1" Source="{Binding FK_ParentData_ChildData, Source={StaticResource dataSetTE}}"/>
        </Window.Resources>
        <Grid DataContext="{StaticResource childDataViewSource}">
            <DataGrid x:Name="childDataDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="childIDColumn" Width="SizeToHeader" Header="Child ID" Binding="{Binding ChildID}"/>
                    <DataGridTextColumn x:Name="childNameColumn" Width="SizeToHeader" Header="Child Name" Binding="{Binding ChildName}"/>
                    <DataGridTextColumn x:Name="parnetIDColumn" Width="SizeToHeader" Header="Parnet ID" Binding="{Binding ParnetID}"/>
                    <DataGridTextColumn Width="SizeToHeader" Header="ParnetName" Binding="{Binding Parnet.ParentName}"/>
                </DataGrid.Columns>
            </DataGrid>
    
        </Grid>
    </Window>
    

    Google了一堆文件,好像沒有好的做法

    2014年4月11日 下午 05:59

解答

  • Combobox , 你可以參考以下的作法.

    Wpf DataGrid Combobox column

    因為寫 WPF 久了, 通常不太直接用 DataTable, 我一般都會轉為強型別的 Data Object 再丟給 UI 去 Bind. 所以根本也不太用到 relation 這種解法.


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

    • 已標示為解答 Wesley Hsu 2014年4月13日 下午 05:40
    2014年4月13日 上午 02:07
    版主

所有回覆

  • 您好,

    請參考這篇「WPF DataGrid Practical Examples」,希望對您有幫助,謝謝!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年4月12日 上午 04:17
  • 您可以利用LINQ從DataSet中的兩個Table查詢出欲顯示的內容, 再顯示到DataGrid, 請參考:Linq To Dataset: Display the Contents of Several Tables in a Data Control

    2014年4月12日 上午 08:08
  • 通常的幾種作法

    (1) 在 Query 資料庫時使用 Join , 取得 join 後的資料當來源

    (2) 分開兩個查詢結果, 在 ViewModel 中做結合

    (3) 分開兩個查詢結果, 使用 Convert , 傳遞 ParentID 取得 ParentName


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

    2014年4月12日 上午 09:28
    版主
  • 它的做法我知道,只是這不是我要的結果
    2014年4月12日 下午 06:12
  • 因為我知道WinForm的DataGridView的Combobox裡面有DisplayMember、ValueMember、DataMember的屬性

    使用BindingSource可以Binding到Releation上面

    等於是Combobox的資料就是Parent的資料,會隨著DataGridView的值自動變換

    既然WinForm可以辦到,想說WPF應該也可以做,因此才想要找這方面的資料

    因為WPF學的時間不夠久,有些東西摸得不是很熟

    2014年4月12日 下午 06:26
  • Combobox , 你可以參考以下的作法.

    Wpf DataGrid Combobox column

    因為寫 WPF 久了, 通常不太直接用 DataTable, 我一般都會轉為強型別的 Data Object 再丟給 UI 去 Bind. 所以根本也不太用到 relation 這種解法.


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

    • 已標示為解答 Wesley Hsu 2014年4月13日 下午 05:40
    2014年4月13日 上午 02:07
    版主
  • 解開了,DataGridComboBoxColumn只要改成這樣就可以了

    <DataGridComboBoxColumn Header="Parnet Name" ItemsSource="{Binding Source={StaticResource childDataViewSource1}}"  SelectedValuePath="ParentID"  DisplayMemberPath="ParnetName" SelectedValueBinding="{Binding ParnetID}"/>
    

    搞了半天原來很簡單,感謝指點~

    DataTable其實我也知道有點老了,不過用很久了,怎麼操作已經得心應手

    Bill Chung大大覺得WPF有甚麼更好的選擇嗎?Entity Framework嗎?

    2014年4月13日 下午 05:40
  • 我是自己弄類似 MVVM 的作法, 以你的例子來看. 我會先建一個 ChildData 的強型別類別 (此類別同時要實作 INotifyPtopertyChanged 介面) , 類別中有對應三個欄位的屬性

    然後再建一個以 ObseverableCollection<T> 為項目屬性型別的類別 (其中 T 就是 ChildData 的型別)

    所以我的 DAO 可能還是用 ADO.NET 讀進 DataReader 或 DataTable , 然後塞進 ObserverableCollection<T> 所在的類別實體中.

    然後根據 View 做出 ViewModel , 把  ViewModel 和 上面的  Model 對應 . UI 的 Binding 來源是 ViewModel

    聽起來有點囉嗦, 但在維護的彈性上是比較靈活的


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

    2014年4月14日 上午 02:00
    版主