web-dev-qa-db-fra.com

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

J'espère que quelqu'un peut aider. Mais chaque fois que je lance mon code et que j'essaie d'afficher une highscore, tout ce que je reçois dans ma liste de sélection est System.Data.DataRowView

Quelqu'un peut-il voir 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;
10
Cain Neal

Je dois toujours faire face à ce problème, même si je définit les paramètres DisplayMember et ValueMembers de ListBox . Votre code actuel est correct et devrait fonctionner si vous avez besoin d'accéder à la valeur de l'élément sélectionné actuellement dans n'importe quelle colonne de votre dTable peut les amener à faire ceci: 

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

Ce qui me plaît dans l’obtention de la totalité de DataRowView, c’est que si vous avez plus de colonnes, vous pouvez toujours accéder à leurs valeurs et en faire tout ce dont vous avez besoin.

15
echavez

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 renvoyées dans dSet.Tables[0].

5
Thorsten Dittmar

Définissez vos champs lstNames.DisplayMember et lstNames.ValueMember .

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


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

Cela devrait résoudre votre problème..

5
Soner Gönül

Comme je l'ai dit dans les commentaires, veuillez ajouter 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;

MODIFIER:

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();
2
DarK

J'utilise :

foreach (DataGridViewRow row in _dataGridView.SelectedRows)
{
    var rowObject = row.DataBoundItem as DataRowView;
    var array = rowObject.Row.ItemArray;
}
0
SijeDeHaan

si vous copiez l'objet au lieu de le placer en tant que nouvel objet, vous obtiendrez cette opération. Essayez de supprimer l'objet et de le remettre. J'ai eu le même problème et c'est ce que j'ai fait. Je ne sais pas pourquoi cela a fonctionné, mais ça a fonctionné.

0
user9039555

assurez-vous simplement que vous saisissez le nom du champ comme dans Source de données dans Word, la casse est respectée

alors : Me.GridLookUpEdit1.Properties.DisplayMember = " cur_code " Est différent de. Me.GridLookUpEdit1.Properties.DisplayMember = " CUR_code "

0
Mohammed Shalabi

Si vous souhaitez que votre zone de liste affiche les valeurs d'une colonne spécifique de la source de données, utilisez LstNames.DataTextField = "SpecialColumnName";

0
Emad