我正在使用WPF。我正在尝试使用网格在我的数据库中显示表。目标是将所有数据都放在该网格中。示例:
ID名字姓氏
1约翰史密斯
2简史密斯
但是,每个单元格应该是一个组合框,如果单击该组合框,则可以选择该特定列。因此,单击John将显示包含表中每个名字的组合框,在这种情况下,它会显示John和Jane。如果用户选择单击ID,则会显示1和2,依此类推。
到目前为止,我尝试使用数据表作为datagrids项目源。这很好用,但我无法在数据表中添加组合框。我可以在数据网格中添加一个组合框列,但后来我不再使用数据表,并且不确定如何使用组合框列遍历数据库中的每一行。
所以我想要的是每个单元格中的组合框,它显示该特定行的相应数据,但点击后会列出所有选项。我一直在寻找,但我不确定我在寻找合适的东西。
我在这里和那里尝试了一些组合框,但没有什么值得注意的。此外,我有自动生成的列,不知道你是否可以有非自动生成的列,仍然使用绑定或如何定义它。
这是生成的数据表。
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();
}
答案 0 :(得分:1)
我会在我的DataGrid
后面创建我的数据对象,其中包含以下属性
ObservableCollection<MyObject> Records
List<int> Ids
List<string> FirstNames
List<string> LastNames
然后使用具有ComboBox的TemplateColumns绑定我的DataGrid,ComboBox绑定到DataContext中的值集合,如下所示:
<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();