1

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) をその都市に関連付けられた対応する公園で埋めようとすると発生します。このメソッドは次のようになります。

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 を戻す原因は何ですか? 私はこれを理解しようとして髪を引っ張っています。また、誰かが選択したデータをコンボボックスにバインドする別の方法を持っている場合は、共有してください! 私はC#の世界に慣れていないので、どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

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

その後、2 番目のクエリでパラメーターを使用できるようになります。

于 2012-05-03T22:29:45.233 に答える
0

コンボボックスを満たす Select ステートメントが間違っています

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

する必要があります

cmd.CommandText = "SELECT Name, CityID FROM Cities ORDER BY Name ASC"; 
于 2012-05-03T22:36:24.393 に答える