C# 什么会导致SelectedValue控件不工作?
我对SelectedValue控件有问题。我首先创建了一个comboBox,与之相关的是以下方法:C# 什么会导致SelectedValue控件不工作?,c#,sql,C#,Sql,我对SelectedValue控件有问题。我首先创建了一个comboBox,与之相关的是以下方法: private void Form1_Load(object sender, EventArgs e) { SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = Fal
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;
}
假设这是我表单中唯一的代码,组合框(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;
}
}
当我加载我的移动应用程序时,第一个组合框没有正确填充,实际上显示的数据是“System32.data…”行,当选择其中任何一个组合框时,我会遇到运行时错误,该错误表示“解析查询时出错。[令牌行号=1,令牌行偏移量=52,令牌行错误=数据]”. 我被引导相信问题本身来自这里的SELECT声明:
cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + " ORDER BY Name ASC";
当我将cbocies.SelectedValue更改为cbocies.SelectedItem时,组合框cboParks会适当填充,减去过滤(它会返回所有数据)。我还可以将其更改为simply CityId(用于测试目的),SELECT语句也可以工作
我也尝试将其参数化,但遇到了一个完全不同的错误:“DbType System.Data.DataRowView与已知的SqlCeType之间不存在映射。”
基本上,是什么导致SelectedValue不起作用并返回第一个方法的相应CityId ValueMember?我正在竭尽全力想弄明白这一点。另外,如果有人有其他方法将所选数据绑定到组合框,请共享!我是C#世界的新手,非常感谢您的帮助。谢谢。从
所选值返回由**ValueMember**属性指定的数据源成员的值。
将字段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);
}
....
然后您将能够在第二个查询中使用参数。填充组合框的Select语句是错误的
cmd.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC";
应该是
cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC";
为什么要设置SelectedIndex=-1?@UlfÅkerstedt:将cboCities的默认值设置为nothing,因此在尝试选择城市之前,它将显示为空。
cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC";