トップ回答者
親子関係のテーブルに連結した ComboBox で、選択時の挙動が変。

質問
-
以下のような親子関係のテーブルを用意しました。
# ひらがな 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 NULLcolumns 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 のアイテムが選択されてしまいます。
このような動作になる理由が分かりません。
お分かりの方がいらっしゃったら、お教え願えませんか。+ 追記 (1)
クリックした通りの選択ができないのは、親子を ListBox で作っても起きてます。
親の選択を上下矢印キーで行ってみると、一番下に着いた後、上に戻ろうとしても戻れません。
マウスクリックで変更しても、飛び飛びでまちまちな選択になります。
+ 追記 (2)
親 ComboBox の「SelectedValue (選択された値)」を「なし」にすると、期待
通りの動きになりました。同じことを追記 (1) の ListBox に適用すると、こちらも期待通りの動きになりました。
でも、この値って、親子間の連携には必要だったのではないでしょうか?
つまりコードで言えば、次の行が必要だったような気がしますが。
Code Snippetthis.nameComboBox.DataBindings.Add(
new Binding("SelectedValue", this.charsBindingSource, "column_id", true)); -
回答
-
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";
すべての返信
-
+かずき+ さん、サポートありがとうございます。
+かずき+ さんからの引用
SelectedValue を設定したときに何故そんな動きになるのかはわかりませんが、
私は SelectedValue の指定はいらなかったような気がします。charsBindingSource 自体が既に columnsBindingSource の FK_chars_columns
に関連付けられているので、自動で親子関係のリレーションの処理はやってく
れると思います。
設定しなくても動くってことは不要なんでしょうね。代替するものが既にあると。
+かずき+ さんからの引用
その自動で動く過程において、SelectedValueのバインドが邪魔して変な動きに
なるのではないかと推測…。
BindingSource の Position と Current の関連を調べてみたところ、Current
はクリックに応じて変化するのですが、Position は即時変化していませんでし
た。msdn によると Position に応じて Current が変化するように書かれてい
るのに。
- BindingSource.Position プロパティCode SnippetPosition プロパティを変更すると、それに合わせて Current プロパティが調整されます。
で、その Position を掴んで離さないやつがいるようです。
故に掴まれた Position に引きずられる形で Current が操作通りの場所になら
ず、引き戻されているような感じがします。その掴んでいるやつが分からないけど。
多分、上記子テーブル側の column_id なんじゃないかなぁ。
-
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"; -