J'essaie d'obtenir les valeurs de chaque colonne d'une ligne sélectionnée dans un DataGrid. Voici ce que j'ai
private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
DataGrid dg = sender as DataGrid;
Console.WriteLine(dg.SelectedCells[0].ToString());
}
Mais ça ne marche pas. Si je fais un SelectedCells.Count
, j'obtiens le nombre correct de colonnes, mais il me semble impossible d'obtenir les valeurs de ces colonnes dans la ligne sélectionnée. J'ai essayé pendant un certain temps sans succès! Voici mon 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>
Idéalement, j'aimerais pouvoir accéder aux données en faisant quelque chose comme rowData.UserID
, mais je n'arrive pas à résoudre le problème. Il y a beaucoup de tutoriels et d'aide pour utiliser DataGridView mais je ne l'utilise pas.
MIS &AGRAVE; JOUR
Pour obtenir les lignes sélectionnées, essayez:
IList rows = dg.SelectedItems;
Vous devriez alors pouvoir accéder à la valeur de la colonne à partir d'un élément de ligne.
OU
DataRowView row = (DataRowView)dg.SelectedItems[0];
Ensuite:
row["ColumnName"];
Solution basée sur la réponse de Tonys:
DataGrid dg = sender as DataGrid;
User row = (User)dg.SelectedItems[0];
Console.WriteLine(row.UserID);
J'ai fait quelque chose de similaire mais j'utilise la reliure pour obtenir l'élément sélectionné:
<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>
Je peux donc accéder à mon nom SelectedContact.Name dans mon ViewModel.
Après des heures passées à trouver des moyens d'obtenir les données de la ligne sélectionnée sur un contrôle WPF DataGrid, car j'utilisais MongoDB. J'ai trouvé ce post et utilisé la réponse de Tony. J'ai révisé le code pour qu'il soit pertinent pour mon projet. Peut-être que quelqu'un peut l'utiliser pour se faire une idée.
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; }
}
Un moyen facile qui fonctionne:
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
}
}
DataGrid obtient les valeurs de colonne des lignes sélectionnées auxquelles il est possible d'accéder par le code ci-dessous. Ici, grid1 est le nom de Gride.
private void Edit_Click(object sender, RoutedEventArgs e)
{
DataRowView rowview = grid1.SelectedItem as DataRowView;
string id = rowview.Row[0].ToString();
}
J'ai utilisé une méthode similaire pour résoudre ce problème en utilisant la suggestion animescm. En effet, nous pouvons obtenir les valeurs de cellules spécifiques d'un groupe de cellules sélectionnées à l'aide d'une liste auxiliaire:
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);
}
}