为什么我在列表框中获得“System.Data.DataRowView”而不是实际值?

时间:2013-03-15 09:17:31

标签: c# mysql winforms

我希望有人可以提供帮助。但每当我运行我的代码并尝试查看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;

12 个答案:

答案 0 :(得分:17)

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

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

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

关于获取整个DataRowView,我喜欢的是,如果您有更多列,您仍然可以访问其值并随意使用它们。

答案 1 :(得分:5)

设置lstNames.DisplayMemberlstNames.ValueMember字段。

  

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


  

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

这可以解决你的问题..

答案 2 :(得分:5)

以下代码应该有效:

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

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

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

答案 3 :(得分: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();

答案 4 :(得分:1)

我知道这是一个老问题。只是认为最好将更新添加到已经给出的答案中。我一直在寻找解决同一问题的方法。我意识到这是您将这三行代码放置在哪个顺序中

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

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

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

答案 5 :(得分:0)

如果希望列表框显示数据源使用的特定列的值 lstNames.DataTextField =“SpecialColumnName”;

答案 6 :(得分:0)

我用:

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

答案 7 :(得分:0)

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

所以:  Me.GridLookUpEdit1.Properties.DisplayMember =“ cur_code ” 不同于  Me.GridLookUpEdit1.Properties.DisplayMember =“ CUR_code

答案 8 :(得分:0)

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

答案 9 :(得分:0)

只有通话顺序错误。首先设置DataSource,然后再设置显示成员:

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

答案 10 :(得分:0)

我也遇到类似的问题,即从填充的列表框中选择一个值并获取System.Data.DataRowView。 通过将所选项目投射到System.Data.DataRowView上,我得以解决 访问Row和ItemArray子类:

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

答案 11 :(得分:-1)

有时可能会导致其显示成员变量名称拼写错误。