什么会导致 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# 世界的新手,因此非常感谢任何帮助。谢谢。

什么会导致 SelectedValue 控件不起作用

来自 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";