【问题标题】:Unable to select multiple rows in a WPF DataGrid无法在 WPF DataGrid 中选择多行
【发布时间】:2014-06-20 19:34:42
【问题描述】:

即使我设置了SelectionMode="Extended"SelectionUnit="FullRow",当我调试SelectionChanged 事件时,SelectedItems 中始终只有一个选定项。

这是我的DataGrid

<DataGrid Grid.Row="0" AutoGenerateColumns="False" Margin="5,5,5,0"
        Name="dgrMembersClub1" ItemsSource="{Binding .}" CanUserAddRows="False"
        SelectionMode="Extended" SelectionUnit="FullRow" SelectionChanged="Grid_SelectionChanged">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Joining" >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding IsSelected}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn IsReadOnly="True" Header="Surname" Binding="{Binding Surname}" />
        <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}" />
        <DataGridTextColumn IsReadOnly="True" Header="Club" Binding="{Binding Club_Id, Converter={StaticResource ClubName}}" />
        <DataGridTextColumn IsReadOnly="True" Header="City" Binding="{Binding City}" />
    </DataGrid.Columns>
</DataGrid>

还有我的Grid_SelectionChanged 活动:

private void Grid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid grid = (DataGrid)sender;
    var test = grid.SelectedItems; //Count == 1 (always)
}

我确实设置了触发器(在 App.xaml 中),用于更改选定行和交替行的背景和前景画笔。如果相关,请告诉我,我会添加代码。

* 编辑 *

当您使用它时,我可以使用一些帮助来让单元格模板中的复选框也能正常工作。漂亮请:)

【问题讨论】:

  • 您可以绑定到 SelectedItems。
  • @GayotFow:这将删除所有未在数据网格中选择的项目,对吧?那不是我真正想要的。问题是我不能选择超过 1 行。
  • 不,不会从网格中删除任何内容。它是一组选定的项目。我一直绑定它。

标签: c# wpf datagrid selecteditem


【解决方案1】:

DataGrid 的 SelectedItems 属性包含一个列表,嗯,选定的项目...

private void DataGrid_SelectionChanged(object sender,
    SelectionChangedEventArgs e)
{
    // ... Get SelectedItems from DataGrid.
    var grid = sender as DataGrid;
    var selected = grid.SelectedItems;

    foreach (var item in selected)
    {
        var dog = item as Dog;
    }
}

这个指示性事件处理程序获取 SelectedItems 并循环遍历它。

但是,有一个警告:

"如果 SelectionMode 属性设置为 Single,则 SelectedItems 列表将仅包含 SelectedItem 属性值。"

来源:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.selecteditems(v=vs.95).aspx

SelectedItems 属性继承自 IList,因此可以对其进行强制转换并对其执行 LINQ 操作。它也适用于非连续选择。

更多提示http://www.dotnetperls.com/datagrid

【讨论】:

  • 谢谢,我对数据网格和项目选择的想法并不陌生。问题是,我更熟悉 Windows Phone 和 Windows RT 等移动平台,其中选择多个项目不需要按下 CTRL 键。我只需要定义一个集合,我可以在其中添加/删除被点击的项目。这通常会产生闪烁。但是,感谢您的回答,这让我开始思考 ;)
  • 帮助正在路上。我关于数据网格食谱的书阐明了许多可以用作模板的不同模式。
【解决方案2】:
private IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
        if (null != row & row.IsSelected) yield return row;
    }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    var rows = GetDataGridRows(dgv_Students);
    string id; //Sample =>"85-999888-2"
    foreach (DataGridRow dr in rows)
    {
        id = (dr.Item as tbl_student).code_meli;
        MessageBox.Show(id);
    }
}

【讨论】:

  • 只是一个建议:您应该在答案中添加一些高级解释。
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 2011-01-30
  • 2012-03-12
  • 2012-10-23
  • 1970-01-01
  • 2012-02-03
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多