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

时间:2012-05-03 22:06:25

标签: 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 = 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#世界的新手所以非常感谢任何帮助。谢谢。

2 个答案:

答案 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";