使用WPF Form DataGrid,DataTable和Combobox

时间:2014-05-06 19:18:07

标签: c# wpf datagrid combobox

我正在使用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();
}

1 个答案:

答案 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();