2012-05-03 13 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; 

    } 

を、コンボボックス(cboCities)がそれに応じて読み込まれます。私の問題は、2番目のコンボボックス(cboParks)に、その都市に関連する公園を記入しようとするときに発生します。 「...... System32.Data」、および:

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; 
     } 
    } 

私は私のモバイルアプリケーションをロードすると、最初のコンボボックスが正しく取り込むとの線に沿ってデータを表示実際にはしません。このメソッドは次のように見えますそれらのいずれかを選択すると、「クエリを解析中にエラーが発生しました」という実行時エラーが発生します。 [トークン行番号= 1、トークン行オフセット= 52、トークンエラー中=データ] "。私はここで、SELECT文から問題自体が信じてリードしている:

cmd.CommandText = "SELECT Name FROM [Parks] WHERE CityId =" + cboCities.SelectedValue + " ORDER BY Name ASC"; 

私はcboCities.SelectedItemにcboCities.SelectedValue、コンボボックス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からも

+0

べきか? –

+0

@UlfÅkerstedt:cboCitiesのデフォルト値を何も設定しないため、都市を選択しようとするまで空白になります。 – PicoDeGallo

答えて

2

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

あなたがValueMemberで、フィールドのCityIDを指定するが、あなたのクエリでこのフィールドが存在しません。
したがって、SelectedValueは、オブジェクトのToString()メソッドの結果を返します。 は、System.Data.DataRowViewになります。

私はあなたが単にだからあなたのコードは、あなたが2番目のクエリでパラメータを使用することができますこの方法で

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

で埋め

+0

ありがとうございました!これで私の問題は解決しました。 – PicoDeGallo

0

SELECT文を使用すると、SelectedIndexを= -1を設定しないのはなぜ

cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC"; 
関連する問題