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#の世界に慣れていないので、どんな助けでも大歓迎です。ありがとうございました。