工作与WPF表单数据网格,数据表和组合框
本文关键字:数据表 组合 网格 数据网 WPF 表单 数据 工作 | 更新日期: 2023-09-27 18:02:14
我正在使用WPF。我试图使用网格来显示我的数据库中的表。我们的目标是把所有的数据放在那个网格中。例子:
姓名
1约翰·史密斯
2简·史密斯
但是,每个单元格应该是一个组合框,如果单击该特定列,则该组合框具有该列的所有选择。因此,单击John将显示包含表中每个名字的组合框,在本例中,它将显示John和Jane。如果用户选择单击ID,则显示1和2,依此类推。
到目前为止,我所尝试的是使用数据表作为数据网格项目源。这可以完美地工作,但是我不能将组合框添加到数据表中。我可以向数据网格添加一个组合框列,但是我不再使用数据表,并且不确定如何使用组合框列迭代数据库中的每一行。
所以我想要的是一个组合框在每个单元格显示相应的数据为特定的行,但在点击它将列出所有的选择。我已经到处找过了,但我不确定我找的是对的东西。
我已经尝试了一些东西这里和那里的组合框,但没有值得注意的。此外,我有自动生成的列,不确定是否可以有非自动生成的列,但仍然使用绑定或如何定义它。
这是生成数据表。
public DataTable PersonData()
{
List<Person> str4 = new List<Person>();
DataTable _PersonData;
_PersonData = new DataTable();
_PersonData.Columns.Add(new DataColumn("FirstName", typeof(string)));
_PersonData.Columns.Add(new DataColumn("LastName", typeof(string)));
str4 = newquery();
str4.ForEach(delegate(Person person1)
{
row3 = _PersonData.NewRow();
_PersonData.Rows.Add(row3);
row3["FirstName"] = person1.FirstName;
row3["Lastname"] = person1.Lastname;
});
return _PersonData;
}
当用户单击列表框中的一个项时,它将绑定数据表。
private void youclickedon(String result)
{
newdatatable = PersonData();
Binding binding = new Binding() {Mode=BindingMode.OneWay, Source = newdatatable, Path = new PropertyPath(".") };
BindingOperations.SetBinding(GridData, DataGrid.ItemsSourceProperty, binding);
GridData.Columns[0].IsReadOnly = true;
newdatatable.AcceptChanges();
}
我将使用以下属性在DataGrid
后面创建我的数据对象
-
ObservableCollection<MyObject> Records
-
List<int> Ids
-
List<string> FirstNames
-
List<string> LastNames
然后使用templatecolumcolumns绑定我的DataGrid,这些templatecolumcolumns具有绑定到DataContext中的值集合的combobox,如下所示:
<DataGrid ItemsSource="{Binding Records}">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Ids}"
SelectedItem="{Binding Id}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.FirstNames}"
SelectedItem="{Binding FirstName}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.LastNames}"
SelectedItem="{Binding LastName}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我会在网格加载时填充我的列表(如果需要的话,可能会随着项目的变化而更新)
Ids = Records.Select(p => p.Id).ToList();
FirstNames = Records.Select(p => p.FirstName).ToList();
LastNames = Records.Select(p => p.LastName).ToList();