Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么会导致SelectedValue控件不工作?_C#_Sql - Fatal编程技术网

C# 什么会导致SelectedValue控件不工作?

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

我对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;

    }
假设这是我表单中唯一的代码,组合框(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";