当我在Wpf应用程序中绑定数据表时,我正在获取空数据网格 [英] I Am Getting Null Data Grid, When I Bind With Datatable In Wpf Application

查看:57
本文介绍了当我在Wpf应用程序中绑定数据表时,我正在获取空数据网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我使用linq lambda表达式绑定wpf中的datagrid时,它会填充数据网格,但是当我尝试将此linq结果转换为datatable时,我的代码下面填充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。日期})
.Join(dm.Own_Company_Infos,r = > r.Owncom,y = > y.Company_Id,(r,y)= > new { r,y.Organization_Name})
.Join(dm.Material_Types,n = > nrMaterial_type,b = > b.Id,(n,t)= > new {nr Export_Matrilas_id,t.Meterial_Name,n.Organization_Name,nrOrganization,nrDate})
.ToList();

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







这里我使用方法转换为datatable





  public  DataTable ToDataTable< T>(IList< T>数据) //   T是任何泛型类型 
{
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 对象 [props.Count];
DataRow行;

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

table.Rows.Add(row);
}

table.Rows.Add(values);

return 表;
}



这是我的xaml代码:

 <   UserControl     x:类  =  Iqbal_Silks.Export_Tanee_Records  

xmlns = http://schemas.microsoft.com/winfx/2006/xaml/presentation
< span class =code-attribute>
< span class =code-attribute> xmlns:x = http://schemas.microsoft。 com / winfx / 2006 / xaml

xmlns:mc = http://schemas.openxmlformats.org/markup-compatibility / 2006

< span class =code-attribute> xmlns:d = http://schemas.microsoft.com/expression/blend/2008

< span class =code-attribute> 高度 = 700 宽度 = 900 >
< UserControl.Resources >
< span class =code-keyword>< ResourceDictionary Source = ../ Themes / Dictionary1.xaml / >
< < span class =code-leadattribute> / UserControl.Resources >

< 网格 >
< DataGrid x:名称 = mygride 保证金 = 3,243,10,64 AutoGenerateColumns = False AlternatingRowremoved = AliceBlue VerticalContentAlignment = 中心 CanUserResizeRows = False Horizo​​ntalContentAlignment = 中心 ScrollViewer.PanningMode = VerticalFirst IsReadOnly = True >
< DataGrid.Columns >

< DataGridTextColumn 标题 = 导出ID 宽度 = 自动 绑定 = {Binding Export_Matrilas_id} / >
< DataGridTextColumn 标题 = 材料 宽度 = 自动 绑定 = {Binding Meterial_Name} / >
< DataGridTextColumn 标题 = 公司 宽度 = 自动 < span class =code-attribute> Binding = {Binding Organization_Name} < span class =code-keyword> / > ;
< DataGridTextColumn 标题 = 客户端 宽度 = 自动 绑定 = {Binding Organization} / >
< DataGridTextColumn 标题 = 日期 宽度 = 自动 绑定 = {Binding Date} / >

< / DataGrid.Columns >
< / DataGrid >
< 按钮 < span class =code-attribute>内容 = Excel记录 x:名称 = btnviewchallan_Copy 样式 = {StaticResource Hdrclose} Horizo​​ntalAlignment = 保证金 = 616,641,0,0 VerticalAlignment = Top 宽度 = 94 高度 = 27 单击 = BtnviewchallanCopyClick / >

< StackPanel 方向 = 水平 Horizo​​ntalAlignment = 拉伸 保证金 = 10,644,768,32 >

< 按钮 名称 = btnFirstPage 内容 = << 点击 = btnFirstPage_Click / >
< 按钮 名称 = btnPreviousPage Conte nt = < 点击 = btnPreviousPage_Click < span class =code-keyword> / >
< 标签 名称 = lblPageIndex 内容 = {Binding ElementName = root,
Path = PageIndex,UpdateSourceTrigger = PropertyChanged}
宽度 = < span class =code-keyword> Auto / >
< < span class =code-leadattribute>标签 内容 = / >
< 标签 名称 = lblPageNumber 内容 = {Binding ElementName = root,
Path = NumberOfPages,UpdateSourceTrigger = PropertyChanged}
宽度 = 自动 / >
< 按钮 名称 = btnNextPage 内容 = < span class =code-keyword>> 点击 = btnNextPage_Click / >
< 按钮 名称 = btnLastPage 内容 = >> 点击 = btnLastPage_Click / >
< / StackPanel >
< / Grid >

解决方案

< blockquote>

我认为你的 ToDataTable 方法在 foreach 循环中有一个错误。试试这个版本。

  public  DataTable ToDataTable< t>(IList< t>数据) //   T是任何泛型类型 
{
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 对象 [props.Count];
foreach var 记录 in data)
{
for int i = 0 ; i < table.Columns.Count; i ++)
{
values [i] =道具[i] .GetValue(记录)!= null ?道具[i] .GetValue(记录):DBNull.Value;
}

table.Rows.Add(values);
}



return 表;
}


When I bind datagrid in wpf with of linq lambda expression its fill datagrid but when I try to convert this linq result in datatable then its fill null datagrid below my code which I tried ....

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;




Here I convert into datatable using method


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


Here is my xaml code:

<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" AlternatingRowremoved="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="<<" Click="btnFirstPage_Click"/>
            <Button Name="btnPreviousPage" Content="<" 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=">" Click="btnNextPage_Click"/>
            <Button Name="btnLastPage" Content=">>" Click="btnLastPage_Click"/>
        </StackPanel> 
</Grid>

解决方案

I think your ToDataTable method has a bug in the foreach loop. Try this version.

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];
           foreach (var record in data)
           {
               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(values);
           }



           return table;
       }


这篇关于当我在Wpf应用程序中绑定数据表时,我正在获取空数据网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆