我遇到了SelectedValue控件的问题。我首先创建了一个comboBox,并绑定它是以下方法:
private void Form1_Load(object sender, EventArgs e)
{
SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = False; Password = *");
cn.Open();
SqlCeCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC";
SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cn.Close();
cboCities.ValueMember = "CityId";
cboCities.DisplayMember = "Name";
cboCities.DataSource = ds.Tables[0];
cboCities.SelectedIndex = -1;
}
假设这是我在表单中出现的唯一代码,则comboBox(cboCities)会相应地填充。当我尝试用与该城市相关联的相应公园填充第二个组合框(cboParks)时,我的问题出现了。该方法如下所示:
private void cboCities_SelectedIndexChanged(object sender, EventArgs e)
{
if (cboCities.SelectedIndex > -1)
{
SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = False; Password = *");
cn.Open();
SqlCeCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + " ORDER BY Name ASC";
SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
cn.Close();
cboParks.ValueMember = "ParkId";
cboParks.DisplayMember = "Name";
cboParks.DataSource = ds.Tables[0];
cboParks.SelectedIndex = -1;
}
}
当我加载我的移动应用程序时,第一个comboBox没有正确填充,实际上显示的数据是:“System32.Data ....”,当选择其中任何一个时,我被带到运行时错误,指出“解析查询时出错。 [令牌行号= 1,令牌行偏移= 52,令牌错误=数据]“。我一直认为问题本身来自SELECT语句:
cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + " ORDER BY Name ASC";
当我将cboCities.SelectedValue更改为cboCities.SelectedItem时,comboBox cboParks会相应地填充减去过滤(它会带回所有数据)。我也可以将它改为简单的CityId(用于测试目的),SELECT语句可以工作。
我也尝试过这样的参数化,但是我遇到了一个完全不同的错误:“从DbType System.Data.DataRowView到已知的SqlCeType没有映射。”
cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId = @CityId ORDER BY Name ASC";
cmd.Parameters.AddWithValue("@CityId", cboCities.SelectedValue);
基本上,是什么原因导致SelectedValue无法工作并带回第一种方法的相应CityId ValueMember?我正在试着想出这个问题。此外,如果有人有另一种方法将选定的数据绑定到组合框,那么请分享!我是C#世界的新手所以非常感谢任何帮助。谢谢。
答案 0 :(得分:2)
从MSDN开始,
The SelectedValue return the value of the member of the data source specified by the **ValueMember** property.
您将字段CityID指定为ValueMember,但在您的查询中此字段不存在 因此,SelectedValue返回对象的ToString()方法的结果。 恰好是System.Data.DataRowView。
我认为您只需将该字段添加到查询中即可解决问题
所以以这种方式改变你的代码
using(SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = False; Password = *"))
{
cn.Open();
SqlCeCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT CityID, Name FROM Cities ORDER BY Name ASC";
SqlCeDataAdapter da = new SqlCeDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
}
....
然后您就可以在第二个查询中使用参数。
答案 1 :(得分:0)
填充Combobox的Select语句错误
cmd.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC";
应该是
cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC";