为什么我在Listbox中获得“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; 

我总是要处理这个问题,即使我设置了ListBox的DisplayMember和ValueMembers。 您当前的代码是正确的并且应该有效,如果您需要访问dTable的任何列的当前所选项值,您可以让他们这样做:

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

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

设置lstNames.DisplayMemberlstNames.ValueMember字段。

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


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

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

以下代码应该工作:

 DataSet dSet = new DataSet(); dAdapter.Fill(dSet); lstNames.DisplayMember = "NameAndScore"; lstNames.ValueMember = "NameAndScore"; lstNames.DataSource = dSet.Tables[0]; 

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

就像我在评论中所说,请将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”;

我用 :

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

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

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

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