Почему я получаю "System.Data.DataRowView" вместо реальных значений в моем списке?
Я надеюсь, что кто-то может помочь. Но всякий раз, когда я запускаю свой код и пытаюсь просмотреть highscore
, все, что я верну в свой список, System.Data.DataRowView
.
Может ли кто-нибудь понять, почему?
код:
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;
Ответы
Ответ 1
Мне всегда приходится иметь дело с этой проблемой, даже если я устанавливаю DisplayMember
и ValueMembers
в окне списка.
Ваш текущий код верен и должен работать, если вам нужен доступ к текущему значению выбранного элемента любого столбца вашей dTable
вы можете получить их следующим образом:
DataRowView drv = (DataRowView)lstNames.SelectedItem;
String valueOfItem = drv["NameAndScore"].ToString();
Что мне нравится в получении всего DataRowView
это то, что если у вас есть больше столбцов, вы все равно можете получить доступ к их значениям и делать с ними все, что вам нужно.
Ответ 2
Установите lstNames.DisplayMember
и lstNames.ValueMember
поля.
Получает или задает свойство, отображаемое для этого элемента управления ListControl.
Получает или задает путь для свойства, которое будет использоваться в качестве фактического значения для элементы в ListControl.
Это должно решить вашу проблему.
Ответ 3
Следующий код должен работать:
DataSet dSet = new DataSet();
dAdapter.Fill(dSet);
lstNames.DisplayMember = "NameAndScore";
lstNames.ValueMember = "NameAndScore";
lstNames.DataSource = dSet.Tables[0];
Если это не сработает, обновите свой вопрос и предоставьте нам некоторую информацию о столбцах и значениях, которые фактически возвращены в dSet.Tables[0]
.
Ответ 4
Как я уже сказал в комментариях, добавьте lstNames.DataBind() в свой код.
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:
Можете ли вы попробовать это:
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();
Ответ 5
Если вы хотите, чтобы в вашем окне списка отображались значения из определенного столбца источника данных, используйте
lstNames.DataTextField = "SpecialColumnName";
Ответ 6
Я использую:
foreach (DataGridViewRow row in _dataGridView.SelectedRows)
{
var rowObject = row.DataBoundItem as DataRowView;
var array = rowObject.Row.ItemArray;
}
Ответ 7
просто убедитесь, что вы вводите имя поля так же, как и в источнике данных, в другом слове оно чувствительно к регистру
так:
Me.GridLookUpEdit1.Properties.DisplayMember = " cur_code"
отличается от
Me.GridLookUpEdit1.Properties.DisplayMember = " CUR_code"
Ответ 8
если вы скопировали объект вместо размещения в качестве нового объекта, он сделает это. Попробуйте удалить объект и снова включить его. У меня была такая же проблема, и это то, что я сделал. Не знаю, почему это сработало, но это произошло.