13 votes

Pourquoi j'obtiens "System.Data.DataRowView" au lieu de valeurs réelles dans ma Listbox WinForms ?

Chaque fois que j'exécute mon code et que j'essaie d'afficher un fichier highscore Tout ce que j'obtiens dans ma boîte à liste, c'est System.Data.DataRowView .

Quelqu'un peut-il comprendre pourquoi ?

Code :

MySqlConnection myConn = new MySqlConnection(connStr);

string sqlStr = "SELECT CONCAT(Name, ' ', Score) as NameAndScore " + 
                "FROM highscore ORDER BY Score DESC";

MySqlDataAdapter dAdapter = new MySqlDataAdapter(sqlStr, myConn);
DataTable dTable = new DataTable();
dAdapter.Fill(dTable);
dAdapter.Dispose();
lstNames.DisplayMember = "NameAndScore";
lstNames.DataSource = dTable;

21voto

echavez Points 847

Je suis toujours confronté à ce problème, même si j'ai défini l'option DisplayMember y ValueMembers de la zone de liste.

Votre code actuel est correct et devrait fonctionner, si vous avez besoin d'accéder à la valeur de l'élément sélectionné de n'importe quelle colonne de votre fichier dTable vous pouvez les amener à le faire :

DataRowView drv = (DataRowView)lstNames.SelectedItem;
String valueOfItem = drv["NameAndScore"].ToString();

Ce que j'apprécie dans le fait de recevoir l'intégralité de la DataRowView est que si vous avez plus de colonnes, vous pouvez toujours accéder à leurs valeurs et faire ce que vous voulez avec.

7voto

Thorsten Dittmar Points 28193

Le code suivant devrait fonctionner :

DataSet dSet = new DataSet();
dAdapter.Fill(dSet);

lstNames.DisplayMember = "NameAndScore";
lstNames.ValueMember = "NameAndScore";
lstNames.DataSource = dSet.Tables[0];

Si cela ne fonctionne pas, veuillez mettre à jour votre question et nous fournir des informations sur les colonnes et les valeurs qui sont effectivement renvoyées dans le fichier dSet.Tables[0] .

5voto

Soner Gönül Points 35739

Définissez votre lstNames.DisplayMember y lstNames.ValueMember champs.

Obtient ou définit la propriété à afficher pour ce ListControl.


Obtient ou définit le chemin de la propriété à utiliser comme valeur réelle pour les éléments du ListControl.

Cela devrait résoudre votre problème.

2voto

DarK Points 221

Comme je l'ai dit dans les commentaires, ajoutez lstNames.DataBind() à votre code.

MySqlConnection myConn = new MySqlConnection(connStr);

string sqlStr = "SELECT CONCAT(Name, ' ', Score) as NameAndScore " + 
                "FROM highscore ORDER BY Score DESC";

MySqlDataAdapter dAdapter = new MySqlDataAdapter(sqlStr, myConn);
DataTable dTable = new DataTable();
dAdapter.Fill(dTable);
dAdapter.Dispose();
lstNames.DisplayMember = "NameAndScore";
lstNames.ValueMember = "NameAndScore";
lstNames.DataSource = dTable;

EDIT :

Pouvez-vous essayer ceci à la place ?

MySqlConnection myConn = new MySqlConnection(connStr);

    string sqlStr = "SELECT CONCAT(Name, ' ', Score) as NameAndScore " + 
                    "FROM highscore ORDER BY Score DESC";

  myConn .Open();

  SqlCommand cmd = new SqlCommand(sqlStr, SQLConnection1);

      SqlDataReader rd = cmd.ExecuteReader();
      while (rd.Read())
      {
        lstNames.Items.Add(rd[0]);
      }
      rd.Close();
      rd.Dispose();
      myConn.Close();

1voto

Emad Points 41

Si vous souhaitez que votre boîte à liste affiche les valeurs d'une colonne spécifique de la source de données, utilisez l'option

lstNames.DataTextField = "SpecialColumnName";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X