我希望有人可以提供帮助。但每当我运行我的代码并尝试查看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;
答案 0 :(得分:17)
我总是要处理这个问题,即使我设置了列表框的DisplayMember
和ValueMembers
。
您当前的代码是正确的并且应该有效,如果您需要访问dTable
任意列的当前所选项目值,您可以让他们这样做:
DataRowView drv = (DataRowView)lstNames.SelectedItem;
String valueOfItem = drv["NameAndScore"].ToString();
关于获取整个DataRowView
,我喜欢的是,如果您有更多列,您仍然可以访问其值并随意使用它们。
答案 1 :(得分:5)
设置lstNames.DisplayMember
和lstNames.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)
有时可能会导致其显示成员变量名称拼写错误。