什么会导致 SelectedValue 控件不起作用
本文关键字:控件 不起作用 SelectedValue 什么 | 更新日期: 2023-09-27 18:33:02
我在使用SelectedValue控件时遇到问题。我首先创建了一个组合框,并与它绑定的是以下方法:
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# 世界的新手,因此非常感谢任何帮助。谢谢。
来自 MSDN,
The SelectedValue return the value of the member of the data source specified by the **ValueMember** property.
将字段 CityID 指定为"值成员",但在查询中不存在此字段。
因此,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);
}
....
然后,您将能够在第二个查询上使用参数。
组合框的选择语句是错误的
cmd.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC";
应该是
cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC";