web-dev-qa-db-fra.com

Obtenir l'élément de ligne sélectionné dans WPF DataGrid

J'ai un DataGrid, lié à la table de base de données, je dois obtenir le contenu de la ligne sélectionnée dans DataGrid, par exemple, je veux afficher le contenu de MessageBox de la ligne sélectionnée.

Exemple de DataGrid:

enter image description here

Donc, si je sélectionne la deuxième ligne, ma MessageBox doit afficher quelque chose comme: 646 Jim Biology.

56
Mike B.

Vous pouvez utiliser la propriété SelectedItem pour obtenir l'objet actuellement sélectionné, que vous pouvez ensuite transtyper dans le type approprié. Par exemple, si votre DataGrid est lié à une collection d'objets Customer, vous pouvez le faire:

Customer customer = (Customer)myDataGrid.SelectedItem;

Sinon, vous pouvez lier SelectedItem à votre classe source ou ViewModel.

<Grid DataContext="MyViewModel">
    <DataGrid ItemsSource="{Binding Path=Customers}"
              SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"/>
</Grid>    
122
Alex McBride

Si vous utilisez le modèle MVVM, vous pouvez lier une propriété SelectedRecord de votre VM à SelectedItem du DataGrid. Ainsi, vous avez toujours la SelectedValue dans votre VM . Sinon, vous devez utiliser la propriété SelectedIndex du Grille de données.

17
ema
public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
        if (null != row) yield return row;
    }
}

private void DataGrid_Details_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {           
        var row_list = GetDataGridRows(DataGrid_Details);
        foreach (DataGridRow single_row in row_lis)
        {
            if (single_row.IsSelected == true)
            {
                MessageBox.Show("the row no."+single_row .GetIndex ().ToString ()+ " is selected!");
            }
        }

    }
    catch { }
}
12
Bahaa Salaheldin

Vous pouvez également:

DataRowView row = dataGrid.SelectedItem as DataRowView;
MessageBox.Show(row.Row.ItemArray[1].ToString());
4
Krytox

C'est assez simple dans ce dg DataGrid et la classe d'item est renseignée dans la grille de données et listblock1 est un cadre de base.

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            var row_list = (Item)dg.SelectedItem;
            listblock1.Content = "You Selected: " + row_list.FirstName + " " + row_list.LastName;
        }
        catch { }

    }
    public class Item
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
4
Ali Zain

Eh bien, je vais mettre la même solution qui fonctionne bien pour moi.

 private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                if (DataGrid1.SelectedItem != null)
                {
                    if (DataGrid1.SelectedItem is YouCustomClass)
                    {
                        var row = (YouCustomClass)DataGrid1.SelectedItem;

                        if (row != null)
                        {
                            // Do something...

                            //  ButtonSaveData.IsEnabled = true;

                            //  LabelName.Content = row.Name;

                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }
2

Je viens de découvrir celui-ci après avoir essayé la réponse de Fara, mais cela n'a pas fonctionné pour mon projet. Faites simplement glisser la colonne de la fenêtre Sources de données, puis déposez-la sur l’étiquette ou la zone de texte.

1
f123

utilisez votre classe Model pour obtenir les valeurs de ligne sélectionnées dans datagrid,

        XDocument xmlDoc = XDocument.Load(filepath);

        if (tablet_DG.SelectedValue == null)
        {
            MessageBox.Show("select any record from list..!", "select atleast one record", MessageBoxButton.OKCancel, MessageBoxImage.Warning);
        }
        else
        {
            try
            {
                string tabletID = "";

                 /*here i have used my model class named as TabletMode*/

                var row_list = (TabletModel)tablet_DG.SelectedItem; 
                 tabletID= row_list.TabletID;

                var items = from item in xmlDoc.Descendants("Tablet")
                            where item.Element("TabletID").Value == tabletID
                            select item;

                foreach (var item in items)
                {
                    item.SetElementValue("Instance",row_list.Instance);
                    item.SetElementValue("Database",row_list.Database);
                }

                xmlDoc.Save(filepath);
                MessageBox.Show("Details Updated..!"
                + Environment.NewLine + "TabletId: " +row_list.TabletID + Environment.NewLine
                + "Instance:" + row_list.Instance + Environment.NewLine + "Database:" + row_list.Database, "", MessageBoxButton.YesNoCancel, MessageBoxImage.Information);
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace);
            }
        }
1
Vijay Chauhan
private void Fetching_Record_Grid_MouseDoubleClick_1(object sender, MouseButtonEventArgs e)
{
    IInputElement element = e.MouseDevice.DirectlyOver;
    if (element != null && element is FrameworkElement)
    {
        if (((FrameworkElement)element).Parent is DataGridCell)
        {
            var grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
            {
                //var rowView = grid.SelectedItem as DataRowView;
                try
                {
                    Station station = (Station)grid.SelectedItem;
                    id_txt.Text =  station.StationID.Trim() ;
                    description_txt.Text =  station.Description.Trim();
                }
                catch
                {

                }
            }
        }
    }
}
1
Adnan Dean Taj

@Krytox répond avec MVVM

    <DataGrid 
        Grid.Column="1" 
        Grid.Row="1"
        Margin="10" Grid.RowSpan="2"
        ItemsSource="{Binding Data_Table}"
        SelectedItem="{Binding Select_Request, Mode=TwoWay}" SelectionChanged="DataGrid_SelectionChanged"/>//The binding



    #region View Model
    private DataRowView select_request;
    public DataRowView Select_Request
    {
        get { return select_request; }
        set
        {
            select_request = value;
            OnPropertyChanged("Select_Request"); //INotifyPropertyChange
            OnSelect_RequestChange();//do stuff
        }
     }
0
Mwspencer

si je sélectionne la deuxième rangée -

 Dim jason As DataRowView


    jason = dg1.SelectedItem

    noteText.Text = jason.Item(0).ToString()

noteText sera 646. Ceci est VB, mais vous l'obtenez.

0
deskplace