none
親子関係のテーブルに連結した ComboBox で、選択時の挙動が変。 RRS feed

  • 質問

  • 以下のような親子関係のテーブルを用意しました。
    # ひらがな 50音のつもりです。


    Code Snippet

    (親) columns テーブル
    --------------------------------------------------
    id          INT         NOT NULL PRIMARYKEY <-------+
    name        VARCHAR(50) NOT NULL                    |
                                                        |
                                                        |
    (子) chars テーブル                                 |
    --------------------------------------------------  |
    id          INT         NOT NULL PRIMARYKEY         |
    column_id   INT         NOT NULL -------------------+ 外部キー
    name        VARCHAR(50) NOT NULL

     

     

    columns             chars
    ----------------------------------------------------------------------
    id  name            id  column_id   name
    ----------------------------------------------------------------------
    1   aa              1   1           a
    2   ka              2   1           i
    3   sa              3   1           u
    4   ta              4   1           e
    5   na              5   1           o
                        6   2           ka
                        7   2           ki
                        :   :           :

     


    Form 上にそれぞれの name を ComboBox として配置し、

    • 親の name ComboBox の選択を変えると、
    • 子の name ComboBox のリスト アイテムが変更される

    ように期待して連結しました。


    動作を確認すると、どうも変な動きになります。


    確認映像では、親を aa, ka, sa,.. と順に選択変更した後、
    親を先頭の aa に戻しても ka になり、
    ta を選択しても na のアイテムが選択されてしまいます。

     

    - 確認映像 (16sec)


    このような動作になる理由が分かりません。
    お分かりの方がいらっしゃったら、お教え願えませんか。


    - ダウンロード : サンプル

     

     

    + 追記 (1)

    クリックした通りの選択ができないのは、親子を ListBox で作っても起きてます。

    親の選択を上下矢印キーで行ってみると、一番下に着いた後、上に戻ろうとしても戻れません。

    マウスクリックで変更しても、飛び飛びでまちまちな選択になります。

     

     

    + 追記 (2)
    親 ComboBox の「SelectedValue (選択された値)」を「なし」にすると、期待
    通りの動きになりました。同じことを追記 (1) の ListBox に適用すると、

    こちらも期待通りの動きになりました。


    - 確認画像 (SelectedValue 設定有り)

    - 確認画像 (SelectedValue 設定無し)


    でも、この値って、親子間の連携には必要だったのではないでしょうか?
    つまりコードで言えば、次の行が必要だったような気がしますが。


    Code Snippet
    this.nameComboBox.DataBindings.Add(
      new Binding("SelectedValue", this.charsBindingSource, "column_id", true));

     

    2008年2月14日 14:49

回答

  • SelectedValueを設定したときに何故そんな動きになるのかはわかりませんが、私はSelectedValueの指定はいらなかったような気がします。

     

    charsBindingSource自体が既にcolumnsBindingSourceのFK_chars_columnsに関連付けられているので、自動で親子関係のリレーションの処理はやってくれると思います。

    その自動で動く過程において、SelectedValueのバインドが邪魔して変な動きになるのではないかと推測…。

    2008年2月16日 1:38
  • TableAdapterで作成したリレーションを使うとうまくいかないのかなぁ? 調べきっていませんが。

    手動で設定するとうまく動きます。

     

       DataRelation rel = new DataRelation("relationAB", syllabaryDataSet.columns.idColumn, syllabaryDataSet.chars.column_idColumn);
       syllabaryDataSet.Relations.Add(rel);

     

       columnsBindingSource.DataSource = syllabaryDataSet;
       columnsBindingSource.DataMember = "columns";

       charsBindingSource.DataSource = columnsBindingSource;
       charsBindingSource.DataMember = "relationAB";

     

       nameComboBox1.DataSource = charsBindingSource;
       nameComboBox1.DisplayMember = "name";

    2008年2月16日 16:58
    モデレータ

すべての返信

  • SelectedValueを設定したときに何故そんな動きになるのかはわかりませんが、私はSelectedValueの指定はいらなかったような気がします。

     

    charsBindingSource自体が既にcolumnsBindingSourceのFK_chars_columnsに関連付けられているので、自動で親子関係のリレーションの処理はやってくれると思います。

    その自動で動く過程において、SelectedValueのバインドが邪魔して変な動きになるのではないかと推測…。

    2008年2月16日 1:38
  • +かずき+ さん、サポートありがとうございます。

     

     +かずき+ さんからの引用

    SelectedValue を設定したときに何故そんな動きになるのかはわかりませんが、
    私は SelectedValue の指定はいらなかったような気がします。

     

    charsBindingSource 自体が既に columnsBindingSource の FK_chars_columns
    に関連付けられているので、自動で親子関係のリレーションの処理はやってく
    れると思います。


    設定しなくても動くってことは不要なんでしょうね。代替するものが既にあると。


     +かずき+ さんからの引用

    その自動で動く過程において、SelectedValueのバインドが邪魔して変な動きに
    なるのではないかと推測…。


    BindingSource の Position と Current の関連を調べてみたところ、Current
    はクリックに応じて変化するのですが、Position は即時変化していませんでし
    た。msdn によると Position に応じて Current が変化するように書かれてい
    るのに。


    - BindingSource.Position プロパティ

    Code Snippet

    Position プロパティを変更すると、それに合わせて Current プロパティが調整されます。

     

    で、その Position を掴んで離さないやつがいるようです。

     

    故に掴まれた Position に引きずられる形で Current が操作通りの場所になら
    ず、引き戻されているような感じがします。

     

    その掴んでいるやつが分からないけど。

    多分、上記子テーブル側の column_id なんじゃないかなぁ。

    2008年2月16日 4:13
  • TableAdapterで作成したリレーションを使うとうまくいかないのかなぁ? 調べきっていませんが。

    手動で設定するとうまく動きます。

     

       DataRelation rel = new DataRelation("relationAB", syllabaryDataSet.columns.idColumn, syllabaryDataSet.chars.column_idColumn);
       syllabaryDataSet.Relations.Add(rel);

     

       columnsBindingSource.DataSource = syllabaryDataSet;
       columnsBindingSource.DataMember = "columns";

       charsBindingSource.DataSource = columnsBindingSource;
       charsBindingSource.DataMember = "relationAB";

     

       nameComboBox1.DataSource = charsBindingSource;
       nameComboBox1.DisplayMember = "name";

    2008年2月16日 16:58
    モデレータ
  • trapemiya さん、調査ありがとうございます。


    デザイナでやってると、余計なことが行われている可能性があるってことです
    よね。でも、その「余計なこと」が何なのか、今の私には分かっていません。


    根本的な理由を理解していないと同じことをやらかしそうなので、今後も調べ
    続けますが、私の力量が足りてないので、現状保留にしたいと思います。

     

    何か新しい発見があったらここに記します。

    また、別な情報をお持ちの方がいらっしゃれば、返信をお願いします。

     

    +かずき+ さん、trapemiya さん、ありがとうございました。

    2008年2月17日 4:03
  • こんにちは。中川俊輔 です。

     

    +かずき+さん、trapemiyaさん、回答ありがとうございます。

     

    custarさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、+かずき+さん、trapemiyaさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    custarさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月21日 9:16