为什么会得到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;
我总是要处理这个问题,即使我设置了列表框的DisplayMember
和ValueMembers
。
你当前的代码是正确的,应该工作,如果你需要访问你的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.DisplayMember
和lstNames.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变量名