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