【问题标题】:DataGrids and data bindings数据网格和数据绑定
【发布时间】:2016-10-20 21:20:28
【问题描述】:

我正在使用 C# 和 XAML 创建一个显示来自数据库的信息的对话框。窗户或多或少地按照应有的方式运行。初始化后,数据库数据会适当地填充DataGrid

如您所见,还有一个ComboBox 用于过滤DataGrid 的内容。它有点这样做。当我从ComboBox 中选择所需的项目时,它会过滤我的数据库,并创建一个包含所有数据的选定对象类型的List<>。我遇到的问题是无法找到用来自List<> 的数据填充临时表以填充DataGrid 的方法。最终发生的事情是这样的:

数据库中的元素有正确的行数,当我运行它时,所有正确的数据都在List<>中;但数据没有显示在行中。

我无法在数据库中为结果创建一个新表,因为 DataGrid 的数据绑定将不起作用;我已经尝试通过帮助类使用来自List<> 的信息重新填充表格...无法弄清楚。

任何想法和/或帮助都会很棒。

这里是我可以发布的尽可能多的代码: XML数据绑定(绑定路径与数据库中的列一致):

<DataGridTextColumn Header="Size" Binding="{Binding Path=ItemSize }"/>
<DataGridTextColumn Header="Elbow" Binding="{Binding Path=Ell}"/>
<DataGridTextColumn Header="Tee" Binding="{Binding Path=Tee}"/>
<DataGridTextColumn Header="Long-Turn Elbow" Binding="{Binding Path=LngEl}"/>
<DataGridTextColumn Header="Check Valve" Binding="{Binding Path=Chk}"/>
<DataGridTextColumn Header="Butterfly Valve" Binding="{Binding Path=Bfy}"/>
<DataGridTextColumn Header="Gate Valve" Binding="{Binding Path=Gate}"/>
<DataGridTextColumn Header="Alarm Valve" Binding="{Binding Path=Alm}"/>
<DataGridTextColumn Header="Dry Pipe Valve" Binding="{Binding Path=DPV}"/>
<DataGridTextColumn Header="45⁰ Elbow" Binding="{Binding Path=45Ell}"/>
<DataGridTextColumn Header="Tee Run" Binding="{Binding Path=Teerun}"/>
<DataGridTextColumn Header="Coupling" Binding="{Binding Path=Coup}"/>
<DataGridTextColumn Header="Swing Check" Binding="{Binding Path=Swg}"/>

C#:

var newTable = new CEqlTable();

var results = from myRow in vTable.AsEnumerable()
              where myRow.SubCategoryID == GetPipeNumber()
              select myRow;

foreach (DataRow dr in results)
{
     var nextEntry = new CEqlTableRec(
         false, (int)dr[0], (int)dr[1], (double)dr[2], (double)dr[3],
         (double)dr[4], (double)dr[5], (double)dr[6], (double)dr[7],
         (double)dr[8], (double)dr[9], (double)dr[10], (double)dr[11],
         (double)dr[12], (double)dr[13], (double)dr[14], (double)dr[15],
         Convert.ToByte(dr[18]));

    newTable.Add(nextEntry);
}

dgPipeDetail.ItemsSource = newTable;

【问题讨论】:

  • 请发布您的 xaml 和 C# 代码的一些有用部分。没有代码,很难说出哪里出了问题。
  • 嘿,Massimiliano,我用尽可能多的代码更新了帖子。
  • newTable 是未过滤的结果吗?还是 newTable 是过滤后的结果?
  • newTable 用于过滤结果。不要让类名欺骗你。它不会创建表。它返回一个列表
  • 能否请您也发布 newTable 的初始化代码?我的意思是,第一次被填满。因为第一次没问题,而“过滤”的时候就不行了,也许它们之间有一些区别。

标签: c# wpf xaml data-binding wpfdatagrid


【解决方案1】:

所以从来没有真正得到足够的信息来诊断问题,但下面我发布了一个非常简单的示例,该示例绑定到后面代码中的集合。我还在主窗口上放了一个按钮。单击按钮时,我清除以前的数据并用新数据填充数据网格。将我在下面的内容与您所拥有的进行比较。看看它是否能给你任何想法。

MainWindow.xaml

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" 
        Height="350" 
        Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <DataGrid ItemsSource="{Binding Classes}"
              CanUserAddRows="False"
              AutoGenerateColumns="False"
              Margin="0,0,220,0.5">
        <DataGrid.Columns>
           <DataGridTextColumn Header="FIRST" Binding="{Binding First}"/>
           <DataGridTextColumn Header="SECOND" Binding="{Binding Second}"/>
           <DataGridTextColumn Header="THIRD" Binding="{Binding Third}"/>
           <DataGridTextColumn Header="FOURTH" Binding="{Binding Fourth}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Swap" 
            HorizontalAlignment="Left" 
            Margin="400,70,0,0" 
            VerticalAlignment="Top" 
            Width="75"
            Command="{Binding SwapCommand}"/>
</Grid>

MainWindow.xaml.cs

namespace DataGridTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            SwapCommand = new RelayCommand(OnExecuteSwap);

            InitializeComponent();

            for(int i = 0; i < 10; i++)
            {
                Classes.Add(
                    new MyClass
                    {
                        First = 10,
                        Second = 20,
                        Third = 30,
                        Fourth = 40
                    });
            }
        }

        private void OnExecuteSwap()
        {
            Classes.Clear();

            for(int i = 0; i < 10; i++)
            {
                Classes.Add(
                    new MyClass
                    {
                        First = 50,
                        Second = 60,
                        Third = 70,
                        Fourth = 80
                    } );
            }
        }

        public ICommand SwapCommand { get; }

        public ObservableCollection<MyClass> Classes { get; } =
            new ObservableCollection<MyClass>();
    }
}

MyClass POCO

namespace DataGridTest
{
    public class MyClass
    {
        public int First { get; set; }
        public int Second { get; set; }
        public int Third { get; set; }
        public int Fourth { get; set; }
    }
}

【讨论】:

  • 感谢大家的帮助!!我得到了它的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2015-05-30
  • 2011-09-14
  • 1970-01-01
  • 2011-09-28
  • 2012-10-29
相关资源
最近更新 更多