Perché ottengo “System.Data.DataRowView” invece di valori reali nel mio Listbox?

Spero che qualcuno possa aiutarti. Ma ogni volta che eseguo il mio codice e provo a visualizzare un highscore tutto quello che torno nella mia listbox è System.Data.DataRowView .

Qualcuno può vedere perché?

Codice:

 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; 

Devo sempre affrontare questo problema, anche se imposto DisplayMember e ValueMembers di ListBox. Il tuo codice attuale è corretto e dovrebbe funzionare, se hai bisogno di accedere al valore corrente dell’elemento selezionato di qualsiasi colonna del tuo dTable puoi farlo facendo questo:

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

Quello che mi piace di ottenere l’intero DataRowView è che se hai più colonne puoi ancora accedere ai loro valori e fare tutto il necessario con loro.

Imposta i campi lstNames.DisplayMember e lstNames.ValueMember .

Ottiene o imposta la proprietà da visualizzare per questo ListControl.


Ottiene o imposta il percorso della proprietà da utilizzare come valore effettivo per gli elementi in ListControl.

Questo dovrebbe risolvere il tuo problema..

Il seguente codice dovrebbe funzionare:

 DataSet dSet = new DataSet(); dAdapter.Fill(dSet); lstNames.DisplayMember = "NameAndScore"; lstNames.ValueMember = "NameAndScore"; lstNames.DataSource = dSet.Tables[0]; 

Se non funziona, aggiorna la tua domanda e forniscici alcune informazioni sulle colonne e i valori effettivamente restituiti in dSet.Tables[0] .

Come ho detto nei commenti, aggiungi lstNames.DataBind () al tuo codice.

 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; 

MODIFICARE:

Puoi provare questo invece:

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

Se si desidera che la casella di riepilogo visualizzi i valori da una colonna specifica dell’origine dati, utilizzare lstNames.DataTextField = “SpecialColumnName”;

Io uso :

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

assicurati solo di digitare il nome del campo come nell’origine dati, in altre parole è una distinzione tra maiuscole e minuscole

quindi: Me.GridLookUpEdit1.Properties.DisplayMember = ” cur_code ” è diverso da Me.GridLookUpEdit1.Properties.DisplayMember = ” CUR_code

se hai copiato l’object invece di posizionarlo come nuovo object, lo farà. Prova a cancellare l’object e rimetterlo. Ho avuto lo stesso problema e questo è quello che ho fatto. Non so perché ha funzionato, ma è successo.