web-dev-qa-db-fra.com

DataGridView récupère l'objet actuellement sélectionné

J'ai besoin d'obtenir l'objet actuellement sélectionné à partir de la base de données DataGridView.

Je n'ai pas besoin de l'objet de la cellule sélectionnée actuelle, mais de l'objet sur lequel la ligne entière est basée, dans ce cas un BusinessObject dont les propriétés font les colonnes de la grille.

Je pourrais passer en revue le DataSource, mais cela en soi n'est qu'un objet et peut être un BindingSource ou un IBindingList ou quelque chose comme ça - donc pas un moyen standardisé facile d'obtenir l'objet voulu.

Derrière cela se trouve la nécessité de simplement vérifier le businessObject pour une propriété appelée IsChanged et demander à l'utilisateur d'enregistrer ou d'annuler les modifications, avant que la source de liaison sélectionne l'élément suivant. Par conséquent, je dois trouver l'objet actuel dans RowValidating-Event du DataGridView, car le BindingSource n'offre pas d'événement à arrêter de changer avant que le changement ne se produise . Voir ici pour le problème bien conn

Merci d'avoir lu ;-)

39
Oliver Friedrich

DataGridViewRow.DataBoundItem contient l'objet 'métier' auquel il est lié.

77
leppie

Voici mon code mettre ceci dans votre classe Person

 public static explicit operator Person(DataRow dr)
    {
        Person p = new Person();
        p.adi = dr.ItemArray[0].ToString();
        p.id = Int32.Parse(dr.ItemArray[1].ToString());
        p.soyadi = dr.ItemArray[2].ToString();
        p.kartNo = dr.ItemArray[3].ToString();
        p.dogumTarihi = DateTime.Parse( dr.ItemArray[4].ToString() );
        p.adres = dr.ItemArray[5].ToString();
        p.meslek = dr.ItemArray[6].ToString();
        p.telefon = dr.ItemArray[7].ToString();
        p.gsm = dr.ItemArray[8].ToString();
        p.eposta = dr.ItemArray[9].ToString();

        return p;
    }

et ceci est un clic sur le bouton de mise à jour

DataRow row = (dataGridView1.SelectedRows[0].DataBoundItem as DataRowView).Row;
Person selected = (Person)row;
7
Kemal Duran

Vous pouvez obtenir la valeur de cellule sélectionnée comme ceci

yourDGV.CurrentCell.Value;

Si vous voulez la valeur sous la forme d'une chaîne, utilisez simplement la méthode ToString () comme celle-ci

yourDGV.CurrentCell.Value.ToString();

Cela devrait le faire

1
F.joksch

Étant donné que vous avez déclaré l'IBindingList - oui, comme d'autres l'ont dit, la propriété DataBoundItem vous donnera ce dont vous avez besoin - il y a un problème avec celui-ci que j'avais rencontré précédemment et qui s'est retrouvé avec une référence nulle mais pour l'instant je ne peux pas penser au scénario dans lequel cela s'est produit.

Si vous êtes lié aux données à l'aide d'un BindingSource - vous pouvez capturer les événements CurrentChanged, CurrentItemChanged de votre BindingSource, vous n'avez pas besoin d'avoir une propriété IsChanged supplémentaire sur votre B.O. .., la source de données sous-jacente peut également indiquer une modification - par exemple, si vous avez BindingSource lié à une table de données, la ligne vous donnera un indicateur modifié.

0
Ken

Et de cette façon?

foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
{
  MessageBox.Show(item.Cells[0].Value.ToString());
}

Nous pouvons obtenir plusieurs données de lignes sélectionnées.

0
Sarvar Nishonboev