2017-02-14 93 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

相關問題