2017-02-14 45 views
2

我有一个Datagrid,它是由组合框过滤的,我想在此数据网格中使用向上向下按钮交换行。如何在不影响数据源的情况下交换WPF中过滤的数据网格中的行?

我对按钮有以下代码按钮,但在交换行之后,datagrid的数据源中的项目将更改为匹配已过滤的项目以及其他行也被删除。

这是我的代码:

if (Datagrid1.SelectedIndex != -1 && Datagrid1.SelectedIndex != 0) 
{ 
    DataTable dt = ((DataView)Datagrid1.ItemsSource).ToTable(); 
    int index = Datagrid1.SelectedIndex; 
    DataRow selectedRow = dt.Rows[index]; 
    DataRow newRow = dt.NewRow(); 
    newRow.ItemArray = selectedRow.ItemArray; 
    dt.Rows.Remove(selectedRow); 
    dt.Rows.InsertAt(newRow, index - 1); 
    Datagrid1.ItemsSource = dt.DefaultView; 
    Datagrid1.SelectedIndex = index - 1; 
} 

我如何改变它们的顺序,而不会影响数据源?

+0

我强烈建议你考虑为您的项目MVVM解决方案。使用MVVM,这些任务会更容易。 – Chrille

+0

@Chrille我不熟悉MVVM。 – JDM

+0

如果您有时间和需要学习,请尝试搜索本主题中的教程。 “MVVM WPF” – Chrille

回答

1

我用这个代码按钮,它的工作:

if (Datagrid1.SelectedIndex != -1 && Datagrid1.SelectedIndex != 0) 
{ 
    int index = Datagrid_PMP.SelectedIndex; 
    DataRow downrow = ((DataRowView)(Datagrid1.SelectedItem)).Row; 
    DataRow temprow = sourceTable.NewRow(); 
    temprow.ItemArray = downrow.ItemArray; 
    sourceTable.Rows.Remove(downrow); 
    Datagrid1.SelectedIndex = index - 1; 
    DataRow uprow = ((DataRowView)(Datagrid1.SelectedItem)).Row; 
    int i = dset.Tables[2].Rows.IndexOf(uprow); 
    sourceTable.Rows.InsertAt(temprow, i); 
    Datagrid1.SelectedIndex = index - 1; 
} 
0

问题在于以下行中您更换当前过滤视图中的项目清单:

Datagrid1.ItemsSource = dt.DefaultView; 

在此之后,只有符合过滤器将填充网格的项目。

+0

我知道。但在发表评论后,这行交换不会发生。 – JDM

+0

您正在交换“dt”中的项目,如果未执行此特定行,将永远不会使用这些项目。我认为你在这里有一个基本问题,你如何在过滤视图中定义交换,在过滤被删除后应该发生什么? – Chrille

+0

我有一个组合框填充了一列dataGrid itemsSource(源DataTable),并且数据网格由在组合框中选择的项过滤,因此过滤器导致显示与combox中选定项相关的行以及仅用户应该在组合框中选择的指定列中交换具有相同值的行。但用户更改后,我需要所有行用于其他目的并保存它们。 – JDM

相关问题