2017-02-14 6 views
2

Ich habe ein Datagrid, das von einer Combobox gefiltert wird, und ich möchte Zeilen in diesem Datagrid mit up und down Tasten tauschen.Wie kann ich Zeilen in einem gefilterten Datagrid in WPF austauschen, ohne die Datenquelle zu beeinträchtigen?

Ich habe den folgenden Code für bis Schaltfläche, aber nach dem Austauschen von Zeilen werden die Elemente in der Datenquelle von Datagrid geändert, um die Elemente zu entsprechen, die gefiltert wurden und andere Zeilen ebenfalls entfernt werden.

Das ist mein Code:

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; 
} 

Wie kann ich die Reihenfolge ändern, ohne die Datenquelle zu beeinflussen?

+0

ich Ihnen dringend, in eine MVVM Lösung für Ihr Projekt aussehen würde empfehlen. Mit MVVM wären solche Aufgaben viel einfacher. – Chrille

+0

@Chrille Ich bin nicht vertraut mit MVVM. – JDM

+0

Wenn Sie die Zeit und den Willen haben zu lernen, versuchen Sie in diesem Thema nach Tutorials zu suchen. "MVVM WPF" – Chrille

Antwort

1

habe ich diesen Code für bis Taste und es funktionierte:

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

Das Problem liegt darin, dass in der folgenden Zeile, die Sie die Liste der Elemente mit der aktuellen gefilterten Ansicht ersetzen:

Datagrid1.ItemsSource = dt.DefaultView; 

Danach wird nur die Elemente Ihre Filterkriterien entsprechen, das Gitter füllen.

+0

Ich weiß. Aber nach dem Kommentar würde dieser Zeilenaustausch nicht stattfinden. – JDM

+0

Sie tauschen die Elemente in "dt" aus, die niemals verwendet werden, wenn diese bestimmte Zeile nicht ausgeführt wird. Ich denke, Sie haben ein grundsätzliches Problem hier, wie definieren Sie einen Swap in einer gefilterten Ansicht, was passieren soll, nachdem die Filterung entfernt wurde? – Chrille

+0

Ich habe eine Combobox, die mit einer Spalte von DataGrid ItemsSource (Quelle DataTable) gefüllt und das Datenraster wird durch das Element in Combobox gefiltert, so dass der Filter Zeilen anzeigen, die mit ausgewählten Element in Combox und nur den Benutzer verwandt ist sollte Zeilen mit demselben Wert in der angegebenen Spalte, die in der Combobox ausgewählt ist, austauschen. Aber nach Benutzeränderungen brauche ich alle Zeilen für andere Zwecke und speichern sie. – JDM

Verwandte Themen