Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据条件在Wpf DataGrid中获取选定项之后的项?_C#_Wpf_Datagrid - Fatal编程技术网

C# 如何根据条件在Wpf DataGrid中获取选定项之后的项?

C# 如何根据条件在Wpf DataGrid中获取选定项之后的项?,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个数据网格,可以从中删除项目。删除一个项意味着它在dataGrid上不再可见,但它仍然在DataSource中 如何将项目(删除当前选定项目后将在列表中可见)设置为选中 我需要得到对象本身,因为我必须检查一些额外的条件,但我能想到的唯一方法是一些讨厌的for循环 private void OnTakeOneClick(object sender, RoutedEventArgs e) { var tableSelectedItem = (PartialPaymentDTO)this

我有一个数据网格,可以从中删除项目。删除一个项意味着它在dataGrid上不再可见,但它仍然在DataSource中

如何将项目(删除当前选定项目后将在列表中可见)设置为选中

我需要得到对象本身,因为我必须检查一些额外的条件,但我能想到的唯一方法是一些讨厌的for循环

private void OnTakeOneClick(object sender, RoutedEventArgs e)
{
    var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
    // var nextItemInGrid = ???

    Model.TakeOrderItemsFromTable(tableSelectedItem);

    if(tableSelectedItem.QuantityOnTable != 0)
    {
        this.TableDataGrid.SelectedItem = tableSelectedItem;
    }
    else
    {
        // select next item in data grid that based on some extra criteria
    }
}
编辑:在选定项目之后获取整个项目列表也会非常有用

请注意我不会从数据源中删除项目。相反,我根据标准将它们隐藏在网格中

WPF:


如果要在
数据网格的
集合中选择
表selecteditem
后面的项,请尝试此操作:

var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
int indexOfSelectedItem = this.TableDataGrid.Items.IndexOf(tableSelectedItem);
int indexOfNextItem = indexOfSelectedItem + 1;
if (this.TableDataGrid.Items.Count > indexOfNextItem)
    this.TableDataGrid.SelectedItem = this.TableDataGrid.Items[indexOfNextItem];

由于列表中有许多项,因此在每次删除时循环遍历所有项不是一个选项

最后,我决定了下一个需要选择的项目

private void OnTakeOneClick(object sender, RoutedEventArgs e)
{
    var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
    Model.TakeOrderItemsFromTable(tableSelectedItem);

    if(tableSelectedItem.QuantityOnTable != 0)
    {
        this.TableDataGrid.SelectedItem = tableSelectedItem;
    }
    else
    {
        int currentSelectedItemIndex = this.TableDataGrid.Items.IndexOf(tableSelectedItem);
        // Skip items before currently selected items
        var tableDataGridItemsAfterSelected = this.TableDataGrid.Items.OfType<PartialPaymentDTO>().Skip(currentSelectedItemIndex);
        foreach (var item in tableDataGridItemsAfterSelected)
        {
            if (item.QuantityOnTable != 0) // Criteria check
            {
                this.TableDataGrid.SelectedItem = item;
                break;
            }
        }
    }
}
private void OnTakeOneClick(对象发送方,路由目标)
{
var tableSelectedItem=(PartialPaymentDTO)this.TableDataGrid.SelectedItem;
Model.TakeOrderItemsFromTable(tableSelectedItem);
如果(tableSelectedItem.QuantityOnTable!=0)
{
this.TableDataGrid.SelectedItem=tableSelectedItem;
}
其他的
{
int currentSelectedItemIndex=this.TableDataGrid.Items.IndexOf(tableSelectedItem);
//在当前选定项目之前跳过项目
var tableDataGridItemsAfterSelected=this.TableDataGrid.Items.OfType().Skip(currentSelectedItemIndex);
foreach(tableDataGridItemsAfterSelected中的变量项)
{
if(item.QuantityOnTable!=0)//条件检查
{
this.TableDataGrid.SelectedItem=项目;
打破
}
}
}
}

是否使用数据绑定填充数据网格并设置当前选定项?如果是这样,我们可以使用xaml。否则,为什么不在删除前对当前项目使用.IndexOf(),在删除后选择该索引?是的,我使用的是数据绑定,但是
AutoGenerateColumns=“False”
谢谢,这不是我一直在寻找的答案,但它引导我找到了答案。你发布的答案使用了我建议的IndexOf方法,那么有什么区别?IndexOf和OfType确实在引擎盖下使用了一个循环…列表中的下一个对象不必满足成为下一个选定项的条件。因此,仅采用索引+1项是不够的。再次感谢您的回答,它帮助我解决了我的问题,但它并不是我问题的解决方案。它肯定是您最初关于如何获取收藏中下一项的索引的问题的答案。。。
private void OnTakeOneClick(object sender, RoutedEventArgs e)
{
    var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
    Model.TakeOrderItemsFromTable(tableSelectedItem);

    if(tableSelectedItem.QuantityOnTable != 0)
    {
        this.TableDataGrid.SelectedItem = tableSelectedItem;
    }
    else
    {
        int currentSelectedItemIndex = this.TableDataGrid.Items.IndexOf(tableSelectedItem);
        // Skip items before currently selected items
        var tableDataGridItemsAfterSelected = this.TableDataGrid.Items.OfType<PartialPaymentDTO>().Skip(currentSelectedItemIndex);
        foreach (var item in tableDataGridItemsAfterSelected)
        {
            if (item.QuantityOnTable != 0) // Criteria check
            {
                this.TableDataGrid.SelectedItem = item;
                break;
            }
        }
    }
}