2015-01-13 88 views
2

與數據表中綁定當我在WPF綁定數據網格與LINQ lambda表達式其填充數據網格,但是當我嘗試下面的數據表,然後其填充空的DataGrid此LINQ結果轉換我代碼我試圖....我得到空數據網格,當我在WPF應用程序

var join = dm.Export_Matrilas_s 
      .Where(rh => rh.Material_type == 5) 
      .Join(dm.Parti_Infos, p => p.Parti_Id, w => w.Parti_Id, (p, w) => new { p.Export_Matrilas_id, p.Material_type, p.Owncom, w.Organization, p.Date }) 
      .Join(dm.Own_Company_Infos, r => r.Owncom, y => y.Company_Id, (r, y) => new { r, y.Organization_Name }) 
      .Join(dm.Material_Types, n => n.r.Material_type, b => b.Id, (n, t) => new { n.r.Export_Matrilas_id, t.Meterial_Name, n.Organization_Name, n.r.Organization, n.r.Date }) 
      .ToList(); 

DataTable gettbl = ToDataTable(join); 
mygride.DataContext = gettbl.DefaultView; 

在這裏,我轉換成數據表的使用方法

public DataTable ToDataTable<T>(IList<T> data)// T is any generic type 
    { 
     PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); 

     DataTable table = new DataTable(); 
     for (int i = 0; i < props.Count; i++) 
     { 
      PropertyDescriptor prop = props[i]; 
      // table.Columns.Add(prop.DisplayName,prop.PropertyType); 
      table.Columns.Add(prop.DisplayName, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
     } 
     object[] values = new object[props.Count]; 
     DataRow row; 

     foreach (var record in data) 
     { 
      row = table.NewRow(); 
      for (int i = 0; i < table.Columns.Count; i++) 
      { 
       values[i] = props[i].GetValue(record) != null ? props[i].GetValue(record) : DBNull.Value; 
      } 

      table.Rows.Add(row); 
     } 

     table.Rows.Add(values); 

     return table; 
    } 

這裏是我的XAML代碼:

<UserControl x:Class="Iqbal_Silks.Export_Tanee_Records" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      Height="700" Width="900"> 
    <UserControl.Resources> 
     <ResourceDictionary Source="../Themes/Dictionary1.xaml"/> 
    </UserControl.Resources> 

    <Grid > 
    <DataGrid x:Name="mygride" Margin="3,243,10,64" AutoGenerateColumns="False" AlternatingRowBackground="AliceBlue" VerticalContentAlignment="Center" CanUserResizeRows="False" HorizontalContentAlignment="Center" ScrollViewer.PanningMode="VerticalFirst" IsReadOnly="True"> 
      <DataGrid.Columns> 

       <DataGridTextColumn Header="Export ID" Width="Auto" Binding="{Binding Export_Matrilas_id}"/> 
       <DataGridTextColumn Header="Materials " Width="Auto" Binding="{Binding Meterial_Name}" /> 
       <DataGridTextColumn Header="Company" Width="Auto" Binding="{Binding Organization_Name}"/> 
       <DataGridTextColumn Header="Client" Width="Auto" Binding="{Binding Organization}"/> 
       <DataGridTextColumn Header="Date" Width="Auto" Binding="{Binding Date}"/> 

      </DataGrid.Columns> 
     </DataGrid> 
     <Button Content="Excel Records" x:Name="btnviewchallan_Copy" Style="{StaticResource Hdrclose}" HorizontalAlignment="Left" Margin="616,641,0,0" VerticalAlignment="Top" Width="94" Height="27" Click="BtnviewchallanCopyClick" /> 

     <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Margin="10,644,768,32"> 
      <Button Name="btnFirstPage" Content="&lt;&lt;" Click="btnFirstPage_Click"/> 
      <Button Name="btnPreviousPage" Content="&lt;" Click="btnPreviousPage_Click"/> 
      <Label Name="lblPageIndex" Content="{Binding ElementName=root, 
       Path=PageIndex, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/> 
      <Label Content="of"/> 
      <Label Name="lblPageNumber" Content="{Binding ElementName=root, 
       Path=NumberOfPages, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/> 
      <Button Name="btnNextPage" Content="&gt;" Click="btnNextPage_Click"/> 
      <Button Name="btnLastPage" Content="&gt;&gt;" Click="btnLastPage_Click"/> 
     </StackPanel> 
</Grid> 
+0

您是否嘗試過通過'ToDataTable()',看看它在做什麼干擾? –

+0

亞..我已經嘗試過破發點,ToDataTable()很好地工作和還添加行和列值,但其並未擔任填寫表格 –

+0

我有更新我的quation –

回答

1

有綁定兩種方式DataGrid

這是可以做到無論是通過DataContext屬性像你正在嘗試做的:

dataGrid1.DataContext = gettbl.DefaultView; 

這裏沒有正確的,因爲你的DataContext在這個情況下,DataTable本身(gettbl),所以這將是正確的:

dataGrid1.DataContext = gettbl; 

不過,若你使用DataContext還需要集合T他ItemsSourceXAML到:

<DataGrid ItemsSource="{Binding Path=DefaultView}"> 

或另一種方式是直接使用ItemsSource屬性(那麼你不需要在XAML任何額外的代碼)

dataGrid1.ItemsSource = gettbl.DefaultView; 

此外,我認爲你的ToDataTable方法一個錯誤。

只添加空行到DataTable,它有一個行比源集合。

DataRow row; 
foreach (var record in data) 
{ 
    row = table.NewRow(); 
    for (int i = 0; i < table.Columns.Count; i++) 
    { 
     values[i] = props[i].GetValue(record) != null ? props[i].GetValue(record) : DBNull.Value; 
    } 
    // You do not set the row columns anywhere. 
    table.Rows.Add(row); 
    // This would work but I'm not sure what you are trying to do. 
    // table.Rows.Add(values); 
} 

// You add an extra row here: is this intended? 
table.Rows.Add(values); 

我也不知道這是個好主意來構建基於指定的對象屬性的數據表列,因爲您已經定義的列數據網格,如果T具有不同的屬性比已經定義的列,然後他們不匹配,你什麼也看不到。

也許你已經這樣做了,但如果不考慮使用指定的列名或讓你的數據網格自動生成列的接口。

相關問題