为什么我在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.DisplayMember
和lstNames.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 ”不同
如果您复制了对象而不是将其作为新对象放置,它将执行此操作。 尝试删除该对象并将其重新打开。 我有同样的问题,这就是我所做的。 不知道为什么会有效,但确实如此。