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

если вы скопировали объект вместо размещения в качестве нового объекта, он сделает это. Попробуйте удалить объект и снова включить его. У меня была такая же проблема, и это то, что я сделал. Не знаю, почему это сработало, но это произошло.