DataGrids 和数据绑定
DataGrids and data bindings
我正在使用 C# 和 XAML 创建一个显示数据库信息的对话框。 window 或多或少地发挥了应有的作用。初始化后,数据库数据会适当地填充 DataGrid
。
如你所见,还有一个ComboBox
,用来过滤DataGrid
的内容。它有点这样做。当我 select 来自 ComboBox
的所需项目时,它会过滤我的数据库,并创建一个 select 对象类型及其所有数据的 List<>
。我遇到的问题是无法找到一种方法来用 List<>
中的数据填充临时 table 来填充 DataGrid
。结果是这样的:
数据库中的元素有正确的行数,当我运行它中断时,所有正确的数据都在List<>
中;但数据未显示在行中。
我无法在数据库中为结果创建一个新的 table,因为这样 DataGrid 的数据绑定将不起作用;我已经尝试通过帮助程序 类 使用来自 List<>
的信息重新填充 table...无法解决这个问题。
任何想法and/or帮助都会很棒。
这里是我所能提供的尽可能多的代码 post:
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;
所以从来没有真正获得足够的信息来诊断问题,但下面我在后面的代码中发布了一个非常简单的绑定到集合的示例。我还在主 window 上放了一个按钮。单击按钮时,我清除以前的数据并用新数据填充数据网格。将下面我所拥有的与您所拥有的进行比较。看看有没有给你点子。
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; }
}
}
我正在使用 C# 和 XAML 创建一个显示数据库信息的对话框。 window 或多或少地发挥了应有的作用。初始化后,数据库数据会适当地填充 DataGrid
。
如你所见,还有一个ComboBox
,用来过滤DataGrid
的内容。它有点这样做。当我 select 来自 ComboBox
的所需项目时,它会过滤我的数据库,并创建一个 select 对象类型及其所有数据的 List<>
。我遇到的问题是无法找到一种方法来用 List<>
中的数据填充临时 table 来填充 DataGrid
。结果是这样的:
数据库中的元素有正确的行数,当我运行它中断时,所有正确的数据都在List<>
中;但数据未显示在行中。
我无法在数据库中为结果创建一个新的 table,因为这样 DataGrid 的数据绑定将不起作用;我已经尝试通过帮助程序 类 使用来自 List<>
的信息重新填充 table...无法解决这个问题。
任何想法and/or帮助都会很棒。
这里是我所能提供的尽可能多的代码 post: 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;
所以从来没有真正获得足够的信息来诊断问题,但下面我在后面的代码中发布了一个非常简单的绑定到集合的示例。我还在主 window 上放了一个按钮。单击按钮时,我清除以前的数据并用新数据填充数据网格。将下面我所拥有的与您所拥有的进行比较。看看有没有给你点子。
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; }
}
}