Почему я получаю "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"

Другие вопросы по тегам