C# 当我在wpf应用程序中绑定datatable时,我得到的是空数据网格

C# 当我在wpf应用程序中绑定datatable时,我得到的是空数据网格,c#,wpf,linq,datagrid,C#,Wpf,Linq,Datagrid,当我在wpf中用linq lambda表达式的值绑定datagrid时,它的填充datagrid,但当我尝试在datatable中转换此linq结果时,它的填充null datagrid位于我尝试的代码下方 var join = dm.Export_Matrilas_s .Where(rh => rh.Material_type == 5) .Join(dm.Parti_Infos, p => p.Parti_Id, w =>

当我在wpf中用linq lambda表达式的值绑定datagrid时,它的填充datagrid,但当我尝试在datatable中转换此linq结果时,它的填充null datagrid位于我尝试的代码下方

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;
在这里,我使用方法将其转换为datatable

  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;
    }
public DataTable ToDataTable(IList data)//T是任何泛型类型
{
PropertyDescriptorCollection props=TypeDescriptor.GetProperties(typeof(T));
DataTable=新的DataTable();
for(int i=0;i
以下是我的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>


有两种方法可以绑定数据网格:

可以通过
DataContext
属性执行,就像您尝试执行的那样:

dataGrid1.DataContext = gettbl.DefaultView;
这在这里是不正确的,因为您的
DataContext
在本例中是
DataTable
本身(gettbl),所以这是正确的:

dataGrid1.DataContext = gettbl;
但是,如果使用
DataContext
,还需要将
XAML
中的
ItemsSource
设置为:

<DataGrid ItemsSource="{Binding Path=DefaultView}">
此外,我认为您的
todata
方法有一个bug

您只将空行添加到
数据表
,并且它比源集合多了一行

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);
DataRow行;
foreach(数据中的var记录)
{
行=table.NewRow();
for(int i=0;i
我也不确定基于指定的对象属性构建数据表列是否是一个好主意,因为您已经为数据网格定义了列,如果
T
的属性与已经定义的列不同,那么它们将不匹配,您将看不到任何内容


也许你已经这么做了,但是如果不考虑使用一个指定列名的接口或者让你的数据网格自动生成列。我试过使用break point,ToDataTable()可以很好地工作,它也可以添加行和列值,但它不是服务填充表我已经更新了我的等式当我使用linq的结果绑定时,然后是它的give记录,但是当我转换为表时,它的填充记录与XAML中映射的记录不同

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);