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.