2 Stimmen

Auswahl des Zeilenindexes in einer Datentabelle (wpf)

Wie wähle ich den Zeilenindex in einer Datentabelle aus?

Das Ereignis SelectionChanged

Der folgende Code funktioniert nicht:

        private DataGridRow dgr = new DataGridRow();

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        this.dgr = this.dataGrid.ItemContainerGenerator.ContainerFromItem(this.dataGrid.SelectedItem) as DataGridRow;
        MessageBox.Show(this.dgr.GetIndex().ToString());

    }

3voto

WPF-it Punkte 19187

Der Grund, warum der obige Code nicht funktionieren würde, ist, dass das WPF-Datengitter virtualisiert ist und die Zeile mit itemContainerGenerator.ContainerFromItem nicht zurückgegeben werden kann, weil sie möglicherweise außerhalb der Bildlaufansicht liegt.

Hierfür müssen Sie die items-Auflistung des Datengitters und den IndexOf-Aufruf mit selected item verwenden.

   private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
   {
         var dg = sender as DataGrid;
         MessageBox.Show(dg.Items.IndexOf(dg.SelectedItem).ToString());
   }

2voto

Ayaz Alifov Punkte 7474

Meine Antwort kommt spät, aber ich hoffe, dass sie für diejenigen, die diesen Beitrag über Suchmaschinen gefunden haben, noch nützlich sein wird. Dies ist eine allgemeinere Lösung, die auch hilft, Indizes für alle ausgewählten Zeilen zu definieren.

List<int> RowIndexes = new List<int>();
int SelectedItemsCount = yourDataGrid.SelectedItems.Count;
   for (int i = 0; i < SelectedItemsCount ; i++)
            {
               RowIndexes.Add(yourDataGrid.Items.IndexOf(yourDataGrid.SelectedItems[i]));
            }

Und jetzt enthält RowIndexes alle Indizes der ausgewählten Zeilen. Fügen Sie den Code einfach in das gewünschte Ereignis ein, das ist alles.

1voto

B.K. Punkte 9716

Dies ist eine späte Antwort, aber so habe ich es geschafft. Dies gibt Ihnen Index jeder ausgewählten Zeile in der DataGrid (dgQuery ist der Name meiner DataGrid):

foreach (var selection in dgQuery.SelectedItems)
{
       DataRowView row = (DataRowView)item;

       int index = Convert.ToInt32(row.Row[0]) - 1;
}

Das Ergebnis ist 1 bei Index 0, also müssen wir bei jedem Index 1 abziehen.

.Row[0] Ist eigentlich eine Spalte (in meinem Kopf)... von diesem DataRowView, nicht sicher, warum es eine Zeile genannt wird. Sie können es zu [1], [2] und so weiter ändern, um andere Zellen innerhalb dieser Zeile anzuzeigen.

Bei dieser Lösung brauchen Sie keine Sammlung, kein Array und nichts dergleichen. Sie arbeiten einfach mit dem, was zur Hand ist, und nutzen den vorhandenen Code.

Das große Plus dieser Implementierung, zumindest für mich, war die Tatsache, dass sie die ausgewählten Elemente in der Reihenfolge durchläuft, in der sie ausgewählt wurden. Dies kann ein sehr leistungsfähiges Werkzeug sein, wenn Sie die Reihenfolge der Auswahl des Benutzers wissen wollen.

Ich poste dies, weil ich gerade über 4 Stunden mit der Suche nach einer Lösung verbracht habe. Ich habe sogar die Kontrollkästchen aufgegeben, weil ich nicht genug Zeit habe, diese so zu implementieren, dass sie gut funktionieren... vielleicht später.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X