1. #1
    Nouveau membre du Club
    Inscrit en
    avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 47
    Points : 35
    Points
    35

    Par défaut DataGrid récupérer la valeur d'une cellule

    Bonjour,
    Soit le xaml suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
                    <DataGrid x:Name="List_E"  HeadersVisibility="None" AutoGenerateColumns="False" IsReadOnly="True" VerticalAlignment="Center" Height="739" SelectionUnit="FullRow" Width="690">
                        <DataGrid.Columns>
     
                            <DataGridTextColumn Header="Nom" Binding="{Binding Nom}" FontWeight="Bold"/>
                              ....
                            <DataGridTextColumn Header="ID" Binding="{Binding CEID}" Foreground="Red"/>
                            <DataGridTemplateColumn>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Button Width="100" IsEnabled="{Binding PDC}" Click="Del_CE">
                                            <StackPanel>
                                                <TextBlock Text="Delete"/>
                                            </StackPanel>
                                        </Button>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
     
     
     
                        </DataGrid.Columns>
     
                    </DataGrid>
    Code du remplissage de List_E (à partir du DataSet DS):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                                List_E.Items.Clear();
                                foreach (DataRow dr in DS.Tables[0].Rows)
                                {
     
                                    if (dr["PDC"].ToString() == "1")
                                    { List_E.Items.Add(new { Nom = dr["Nom"].ToString(), Prenom = dr["Prenom"].ToString(), Heure_arr = dr["Heure_arr"].ToString(), An = dr["An"].ToString(), CEID = dr["CEID"].ToString(), PDC = true }); }
                                    { List_E.Items.Add(new { Nom = dr["Nom"].ToString(), Prenom = dr["Prenom"].ToString(), Heure_arr = dr["Heure_arr"].ToString(), An = dr["An"].ToString(), CEID = dr["CEID"].ToString(), PDC = false }); }
                                    // List_E.Items.Add(dr["Nom"].ToString(),dr["Prenom"].ToString(),dr["Heure_arr"].ToString());
                                }
    Puis le code du Delete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void Del_CE(object sender,RoutedEventArgs e)
            {
                DataRowView drv = (DataRowView)List_E.SelectedItem;
                String result = (drv["CEID"]).ToString();
     
                //     MessageBox.Show(result);
            }
    Problème:erreur sur Delete:
    SystemInvalidCastException:Impossible d'effectuer un cast d'un objet de type AnonymousType0 .... en type System.Data.DataRowView

    D'avance merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 415
    Points : 655
    Points
    655

    Par défaut

    DataGrid.SelectedItem renvoie directement l'objet sélection, qui est ici un type anonyme, et non la ligne sélectionnée. Je ne suis pas sur que tu puisses récupérer directement une ligne sélectionnée et de toute façon ce sera plus simple et plus propre de déclarer un type et de récupérer l'objet par le SelectedItem.

  3. #3
    Nouveau membre du Club
    Inscrit en
    avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 47
    Points : 35
    Points
    35

    Par défaut

    Bonjour,
    Merci pour votre réponse.
    Pouvez-vous être plus précis concernant le selectedItem?

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 415
    Points : 655
    Points
    655

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class ClasseCE
    {
        int Id { get; set; }
        // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void Del_CE(object sender,RoutedEventArgs e)
    {
        ClasseCE ce= (ClasseCE)List_E.SelectedItem;
        String result = ce.Id.ToString();
     
        //     MessageBox.Show(result);
     }

  5. #5
    Nouveau membre du Club
    Inscrit en
    avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 47
    Points : 35
    Points
    35

    Par défaut

    Voici la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            public class ClasseCE
            {
                public string Nom { get; set; }
                public string Prenom { get; set; }
                public string Heure_arr { get; set; }
                public string An { get; set; }
                public Int64 CEID { get; set; }
                public Boolean PDC { get; set; }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            private void Del_CE(object sender,RoutedEventArgs e)
            {
                ClasseCE ce = (ClasseCE)List_E.SelectedItem;
    ...
    Mais sur le Del_CE:

    System.Invalid.CastException:Impossible d'effectuer un cast d'un objet de type 'System.Data.DataRowView' en type 'ClasseCE'.

  6. #6
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2013
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2013
    Messages : 1 419
    Points : 3 134
    Points
    3 134

    Par défaut

    Citation Envoyé par laetisam Voir le message
    Mais sur le Del_CE:

    System.Invalid.CastException:Impossible d'effectuer un cast d'un objet de type 'System.Data.DataRowView' en type 'ClasseCE'.
    A priori, c'est normal. Lorsque tu alimentes ton datagrid tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     foreach (DataRow dr in DS.Tables[0].Rows)
                                {
     
                                    if (dr["PDC"].ToString() == "1")
                                    { List_E.Items.Add(new { Nom = dr["Nom"].ToString(), Prenom = dr["Prenom"].ToString(), Heure_arr = dr["Heure_arr"].ToString(), An = dr["An"].ToString(), CEID = dr["CEID"].ToString(), PDC = true }); }
                                    { List_E.Items.Add(new { Nom = dr["Nom"].ToString(), Prenom = dr["Prenom"].ToString(), Heure_arr = dr["Heure_arr"].ToString(), An = dr["An"].ToString(), CEID = dr["CEID"].ToString(), PDC = false }); }
                                    // List_E.Items.Add(dr["Nom"].ToString(),dr["Prenom"].ToString(),dr["Heure_arr"].ToString());
                                }
    Ici, il faudrait que tu indique le type d'objet que tu instancies :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List_E.Items.Add(new ClasseCE{ Nom = dr["Nom"].ToString(), Prenom = dr["Prenom"].ToString(), Heure_arr = dr["Heure_arr"].ToString(), An = dr["An"].ToString(), CEID = dr["CEID"].ToString(), PDC = true });

  7. #7
    Nouveau membre du Club
    Inscrit en
    avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 47
    Points : 35
    Points
    35

    Par défaut

    OK, grand merci cela fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2007, 15h52
  2. Récupérer la valeur d'une cellule du tableur OOo
    Par manubrard dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 22/02/2006, 18h51
  3. [WebForms][DataGrid] Récupérer la valeur d'une cellule...
    Par elbj dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 12/12/2005, 15h00
  4. [C#] [Automation Word] Récupérer la valeur d'une cellule
    Par Ditch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/06/2004, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo