12

我希望有人能帮忙。但是每当我运行我的代码并尝试查看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;
4

12 回答 12

21

我总是要处理这个问题,即使我设置了列表框的DisplayMemberValueMembers

您当前的代码是正确的并且应该可以工作,如果您需要访问任何列的当前选定项目值,dTable您可以让他们这样做:

DataRowView drv = (DataRowView)lstNames.SelectedItem;
String valueOfItem = drv["NameAndScore"].ToString();

我喜欢获得完整DataRowView的内容是,如果您有更多列,您仍然可以访问它们的值并使用它们做任何您需要的事情。

于 2013-03-15T16:38:11.553 回答
6

以下代码应该可以工作:

DataSet dSet = new DataSet();
dAdapter.Fill(dSet);

lstNames.DisplayMember = "NameAndScore";
lstNames.ValueMember = "NameAndScore";
lstNames.DataSource = dSet.Tables[0];

如果它不起作用,请更新您的问题并向我们提供有关实际返回的列和值的一些信息dSet.Tables[0]

于 2013-03-15T10:13:31.143 回答
5

设置您的lstNames.DisplayMemberlstNames.ValueMember字段。

获取或设置要为此 ListControl 显示的属性。


获取或设置要用作 ListControl 中项的实际值的属性的路径。

这应该可以解决您的问题..

于 2013-03-15T09:22:10.940 回答
2

就像我在评论中所说,请将 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();
于 2013-03-15T09:27:31.173 回答
1

只有调用的顺序是错误的。首先设置 ,DataSource然后才设置显示成员:

lstNames.DataSource = dTable;
lstNames.DisplayMember = "NameAndScore";
于 2019-11-11T16:10:31.963 回答
1

我知道这是一个老问题。只是认为为已经给出的答案添加更新可能会很好。我一直在寻找相同问题的解决方案。我意识到这是您放置这 3 行代码的顺序

lstNames.DisplayMember = "NameAndScore";
lstNames.ValueMember = "NameAndScore";
lstNames.DataSource = dTable;

它应该首先使用数据源。然后是 value 成员,然后是 display 成员如下:

lstNames.DataSource = dTable;
lstNames.ValueMember = "NameAndScore";
lstNames.DisplayMember = "NameAndScore";
于 2020-05-26T22:39:44.653 回答
0

如果您希望列表框显示来自数据源特定列的值,请使用 lstNames.DataTextField = "SpecialColumnName";

于 2014-04-16T07:13:07.953 回答
0

我用 :

foreach (DataGridViewRow row in _dataGridView.SelectedRows)
{
    var rowObject = row.DataBoundItem as DataRowView;
    var array = rowObject.Row.ItemArray;
}
于 2015-12-24T15:47:16.593 回答
0

只需确保您输入的字段名称与数据源中的字段名称相同,换句话说,它区分大小写

所以:Me.GridLookUpEdit1.Properties.DisplayMember = " cur_code " 与 Me.GridLookUpEdit1.Properties.DisplayMember = " CUR_code "不同

于 2017-10-08T19:46:54.650 回答
0

如果您复制对象而不是作为新对象放置,它将执行此操作。尝试删除对象并将其放回原处。我有同样的问题,这就是我所做的。不知道为什么它有效,但它确实有效。

于 2017-12-01T14:31:38.963 回答
0

我有类似的问题,从填充的列表框中选择单个值并获取System.Data.DataRowView. 我能够通过将所选项目转换为System.Data.DataRowView然后访问 Row 和 ItemArray 子类来解决它:

var si = ListBox1.SelectedItem; 
string val = ((System.Data.DataRowView)si).Row.ItemArray[0].ToString();
于 2020-02-12T18:47:01.700 回答
-1

有时可能导致它拼写错误的显示成员变量名。

于 2020-02-15T11:27:50.267 回答