2012-05-03 47 views
1

我遇到了SelectedValue控件的问题。我已经首次创建组合框,以及与其相关的是以下的方法:什么会导致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; 
     } 
    } 

当我加载了我的移动应用程序,第一组合框未正确填充,并在实际上线沿线的显示数据:“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?我正试图弄清楚这一点。此外,如果任何人有另一种方法将选定的数据绑定到comboBoxes,那么请分享!我是C#世界的新手,非常感谢任何帮助。谢谢。

+0

你为什么将selectedIndex = -1? –

+0

@UlfÅkerstedt:将cboCities的默认值设置为空,直到尝试选择一个城市才显示为空白。 – PicoDeGallo

回答

2

由于从MSDN

The SelectedValue return the value of the member of the data source specified by the **ValueMember** property.

指定为ValueMember领域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); 
}   
.... 

,那么你就可以在第二查询中使用的参数。

+0

非常感谢!这解决了我的问题。 – PicoDeGallo

0

填充组合框的SELECT语句是错误的

cmd.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC"; 

应该

cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC"; 
相关问题