带有组合框的WPF Datagrid和从DataSet加载

时间:2011-07-05 12:05:14

标签: c# .net wpf datagrid datatable

我是WPF的新手,并尝试使用DataGrid创建一个简单的应用程序。此应用程序从WebService接收Employees DataSet,并且必须允许查看和编辑数据。 DataSet包含三个表:Employees(id,Name,GenderId,PositionId),Genders(id,Name)和Positions(Id,Name)。员工表通过GenderId与Genders连接,通过PositionId与职位连接。 我已将Employees DataSet拖到窗口并获得了允许编辑项目的DataGrid。但现在它包含Position和Gender的ID,我需要ComboBoxes,它允许从可用值中选择Gender或Position并将它们保存回DataSet。 我按以下方式加载DataSet:

EmployeesProxy.EmployeesServiceClient proxy = new EmployeesProxy.EmployeesServiceClient();
        proxy.ClientCredentials.UserName.UserName = "user1";
        proxy.ClientCredentials.UserName.Password = "pass1";
        empDataSet = proxy.GetEmployeesData();
        employeesDataGrid.ItemsSource = empDataSet.Employees.DefaultView;
        GenderDT = empDataSet.Gender;

        proxy.Close();

我的empDataSet和GenderDT在我的窗口中作为属性。 但是,我无法使用允许编辑数据的组合框在XAML中创建一个列。有没有办法做到这一点?

编辑:我发现这个解决方案部分有效(我可以在编辑模式下选择性别,但在普通模式下无法查看性别名称,我只看到ID):

<DataGridTemplateColumn Header="Gender">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=GenderDT, 
                                                RelativeSource={RelativeSource FindAncestor, 
                                                AncestorType={x:Type Window}}}"  
                                  DisplayMemberPath="Name" 
                                  SelectedValuePath="Gender" SelectionChanged="ComboBox_SelectionChanged" Loaded="ComboBox_Loaded"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>                    
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=GenderId}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>                    
            </DataGridTemplateColumn>

更改ComboBox后,我更改了Gender Column:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ((DataRowView)employeesDataGrid.SelectedItem).Row["GenderId"] = ((DataRowView)((ComboBox)sender).SelectedItem).Row["Id"];
    }

但是,对我而言,这不是一个好习惯。而我仍然没有得到理想的结果。我认为可能有一种简单的方法来完成这项任务。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并找到了解决方案。我希望这会对某人有所帮助。 首先,您必须将DataGrid数据绑定到主表(在您的情况下为Employees):

myDataGrid.ItemsSource = dataset.Employees.DefaultView;

然后将一个组合添加到DataGrid并为其命名,例如:positionCombo。然后你必须将组合(positionCombo)的数据绑定到相关的表

positionCombo.ItemsSource = dataset.Positions.DefaultView;

之后你必须在XAML中指定一些属性:

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False">
   <DataGrid.Columns>
        <DataGridComboBoxColumn x:Name="positionCombo" Header="Position" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValueBinding="{Binding PositionId}"/>
   </DataGrid.Columns>
</DataGrid>

请注意(名称,ID)是“职位”表中的字段,“PositionId”是“员工”表中的FK。

答案 1 :(得分:0)

您可以使用DataGridTemplateColumn:

 <DataGridTemplateColumn >
                     <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                           <ComboBox >
                              ....
                           </ComboBox>
                        </DataTemplate>
                     </DataGridTemplateColumn.CellTemplate>
                  </DataGridTemplateColumn>