为什么会得到system.data.datarowview;而不是真正的值在我的WinForms列表框

本文关键字:我的 列表 WinForms system data datarowview 为什么 | 更新日期: 2023-09-27 18:04:06

每当我运行代码并尝试查看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;

为什么会得到system.data.datarowview;而不是真正的值在我的WinForms列表框

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

你当前的代码是正确的,应该工作,如果你需要访问你的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.DisplayMemberlstNames.ValueMember字段

获取或设置要为此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();

只是调用的顺序不对。首先设置DataSource,然后再设置display成员:

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

如果您希望列表框显示数据源的特定列的值,请使用

lstNames.DataTextField = "SpecialColumnName";

我使用:

foreach (DataGridViewRow row in _dataGridView.SelectedRows)
{
    var rowObject = row.DataBoundItem as DataRowView;
    var array = rowObject.Row.ItemArray;
}

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

var si = ListBox1.SelectedItem; 
string val = ((System.Data.DataRowView)si).Row.ItemArray[0].ToString();

我知道这是个老问题。只是觉得在已经给出的答案中添加一个更新可能会很好。我也在寻找解决这个问题的方法。我意识到这是你放置这三行代码的顺序

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

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

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

请确保输入的字段名与数据源中的相同换句话说,要区分大小写

:Me.GridLookUpEdit1.Properties。DisplayMember = "cur_code"不同于Me.GridLookUpEdit1.Properties。DisplayMember = "CUR_code"

如果您复制对象而不是将其放置为新对象,则会这样做。尝试删除对象并将其重新安装。我也有同样的问题,这就是我所做的。不知道为什么会成功,但它确实成功了。

有时可能是拼错了displaymember变量名