it-swarm.com.de

DataGrid ruft die Spaltenwerte der ausgewählten Zeilen ab

Ich versuche, die Werte jeder Spalte einer ausgewählten Zeile in einem DataGrid abzurufen. Das ist was ich habe:

private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    Console.WriteLine(dg.SelectedCells[0].ToString());
}

Das funktioniert aber nicht. Wenn ich einen SelectedCells.Count mache, erhalte ich die korrekte Anzahl von Spalten, aber ich scheine nicht wirklich die Werte dieser Spalten in der ausgewählten Zeile zu erhalten. Ich habe eine ganze Weile ohne Glück versucht! Hier ist meine XAML:

<Grid>
    <DataGrid CanUserAddRows="True" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Stretch" Margin="12,12,79,0" Name="dataGrid1" VerticalAlignment="Top" Width="389" DataContext="{Binding}" CanUserResizeColumns="False" CanUserResizeRows="False" HorizontalContentAlignment="Stretch" PreviewMouseDoubleClick="dataGrid1_PreviewMouseDoubleClick" CellEditEnding="dataGrid1_CellEditEnding">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding  Path=UserID}"
                                Header="User ID" Width="SizeToHeader" />
            <DataGridTextColumn Binding="{Binding  Path=UserName}"
                                Header="User ID" Width="SizeToHeader" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Ich möchte im Idealfall auf die Daten zugreifen, indem ich etwas wie rowData.UserID mache, aber ich scheine es nicht zu klären. Es gibt viele Anleitungen und Hilfe für die Verwendung von DataGridView, aber ich verwende das nicht.

33
Prisoner

AKTUALISIERTE

Um die ausgewählten Zeilen zu erhalten, versuchen Sie Folgendes:

IList rows = dg.SelectedItems;

Sie sollten dann in der Lage sein, aus einem Zeilenelement auf den Spaltenwert zuzugreifen.

ODER

DataRowView row = (DataRowView)dg.SelectedItems[0];

Dann:

row["ColumnName"];
59
Tony Abrams

Lösung basierend auf Tonys Antwort:

        DataGrid dg = sender as DataGrid;
        User row = (User)dg.SelectedItems[0];
        Console.WriteLine(row.UserID);
7
Prisoner

Ich habe etwas Ähnliches gemacht, aber ich verwende Binding, um den ausgewählten Artikel zu erhalten:

<DataGrid Grid.Row="1" AutoGenerateColumns="False" Name="dataGrid"
          IsReadOnly="True" SelectionMode="Single"
          ItemsSource="{Binding ObservableContactList}" 
          SelectedItem="{Binding SelectedContact}">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/>
    <DataGridTextColumn Binding="{Binding Path=FamilyName}" Header="FamilyName"/>
    <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age"/>
    <DataGridTextColumn Binding="{Binding Path=Relation}" Header="Relation"/>
    <DataGridTextColumn Binding="{Binding Path=Phone.Display}" Header="Phone"/>
    <DataGridTextColumn Binding="{Binding Path=Address.Display}" Header="Addr"/>
    <DataGridTextColumn Binding="{Binding Path=Mail}" Header="E-mail"/>
  </DataGrid.Columns>
</DataGrid>

So kann ich auf mein SelectedContact.Name in meinem ViewModel zugreifen.

6
Philippe Lavoie

Ich glaube, der Grund, warum es keine einfache Eigenschaft gibt, auf die ausgewählte row eines WPF-DataGrid zuzugreifen, liegt darin, dass der Auswahlmodus eines DataGrid-Objekts entweder auf Zeilenebene oder auf Zellenebene festgelegt werden kann. Daher werden alle auswahlbezogenen Eigenschaften und Ereignisse für die Auswahl auf Zellenebene geschrieben. Sie haben immer Zellen ausgewählt, unabhängig vom Auswahlmodus des Rasters. Es ist jedoch nicht garantiert, dass Sie ein ausgewähltes Reihe.

Ich weiß nicht genau, was Sie durch das Behandeln des CellEditEnding-Ereignisses erreichen möchten, aber um die Werte aller ausgewählten Zellen zu erhalten, wenn Sie eine Zeile auswählen, sollten Sie stattdessen das SelectedCellsChanged-Ereignis behandeln. Beachten Sie insbesondere die Anmerkungen in diesem Artikel:

Sie können mit dem .__ umgehen. SelectedCellsChanged-Ereignis, das .__ sein soll. benachrichtigt, wenn die Sammlung von ausgewählte Zellen werden geändert. Wenn der Auswahl enthält vollständige Zeilen, die Selector.SelectionChanged-Ereignis ist auch angehoben.

Sie können die AddedCells und .__ abrufen. Entfernte Zellen aus der SelectedCellsChangedEventArgs in der Eventhandler.

Ich hoffe, das hilft, dich auf den richtigen Weg zu bringen. :)

2
Dan J

Nach Stunden der Suche nach Möglichkeiten, wie die Daten aus der in einem WPF DataGrid-Steuerelement ausgewählten Zeile abgerufen werden können, da ich MongoDB verwendet habe. Ich habe diesen Beitrag gefunden und Tonys Antwort verwendet. Ich habe den Code überarbeitet, um für mein Projekt relevant zu sein. Vielleicht kann jemand damit eine Idee bekommen.

private void selectionChanged(object sender, SelectionChangedEventArgs e)
    {
        facultyData row = (facultyData)facultyDataGrid.SelectedItem;
        facultyID_Textbox.Text = row.facultyID;
        lastName_TextBox.Text = row.lastName;
        firstName_TextBox.Text = row.firstName;
        middleName_TextBox.Text = row.middleName;
        age_TextBox.Text = row.age.ToString();
    }

}

class facultyData
{
    public ObjectId _id { get; set; }
    public string facultyID { get; set; }
    public string acadYear { get; set; }
    public string program { get; set; }   
}
1
f123

Ein einfacher Weg, der funktioniert:

private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    foreach (var item in e.AddedCells)
    {
        var col = item.Column as DataGridColumn;
        var fc = col.GetCellContent(item.Item);

        if (fc is CheckBox)
        {
            Debug.WriteLine("Values" + (fc as CheckBox).IsChecked);
        }
        else if(fc is TextBlock)
        {
            Debug.WriteLine("Values" + (fc as TextBlock).Text);
        }
        //// Like this for all available types of cells
    }
}
1
aminescm

DataGrid ruft die Spaltenwerte der ausgewählten Zeilen ab, auf die mit dem folgenden Code zugegriffen werden kann. Hier ist grid1 der Name von Gride.

private void Edit_Click(object sender, RoutedEventArgs e)
{
    DataRowView rowview = grid1.SelectedItem as DataRowView;
    string id = rowview.Row[0].ToString();
}
1
Ambikesh Mishra

Ich habe dieses Problem auf ähnliche Weise gelöst, indem ich die Animescm-Anregung verwendete. In der Tat können wir die spezifischen Zellenwerte aus einer Gruppe von ausgewählten Zellen mithilfe einer Hilfsliste erhalten:

private void dataGridCase_SelectionChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (var item in e.AddedCells)
        {
            var col = item.Column as DataGridColumn;
            var fc = col.GetCellContent(item.Item);
            lstTxns.Items.Add((fc as TextBlock).Text);
        }
    }
0
Oswaldo Zarate