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