データバインディングのおべんきょ。その11。
前回までのあらすじ
あれ?また 'とりこびと' いないYO!
そうです。元の IEnumerable な WankumaEntertainerEnum に要素を追加しても、ComboBox には反映されなかったのです。残念無念。・・・って忘れてませんか?ここでやったことを。それって、
BindingSource に追加するんやないの?
そうでした。BindingSource 経由でやればなんでもかんでもやってくれそうでした!なので、前回の Button1_Click を以下の内容に変更します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me._entertainersBindingSource.Add(New WankumaEntertainer("とりこびと"))
End Sub
_entertainersBindingSource.Add っす。これで、いけるっしょ♪
ではでは、実行してみましょう。Button1 をクリックしてから ComboBox1 のリストを確認してみてください。
お?'とりこびと' おるやん♪(ありがたや~。)
やれやれ、今度こそIEnumerable インターフェイスを実装したクラスによるデータバインディングのおべんきょはおしまいですね♪
って、あま~~~~~~~~~~~~~~~~~~~~~~い!(使い方間違ってる気がしますが。)
ええ、あまいです、あまちゃんもいいとこですよ!(プンスカ!
ちょっとこんなの試してみてください。デザイナから Form1 にButton をもう一つ追加して(Button2で。)Form1 のコードに以下の内容を追加します。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MessageBox.Show _
("ComboBox1 の項目数は" & Me.ComboBox1.Items.Count.ToString & "個ですが、" & _
"_entertainerEnumの要素数は" & Me._entertainerEnum.Count.ToString & "個です。")
End Sub
ComboBox1 の項目数と_entertainerEnumの要素数を取得してメッセージを表示するコードですね。
すでにコード内の文字列を見るだけでなんとも目的も結果も分かってしまうわけですが、実行してみましょう。Button1 をクリックしてから Button2 をクリックして項目数と要素数を確認してみてください。表示されるメッセージをコピペしますと、
ComboBox1 の項目数は4個ですが、_entertainerEnumの要素数は3個です。
・・・最悪です。またです。データと表示内容が一致しません。あまりに悔しいのでちょっと調べてきました。
どうやら、BindingSource のDataSource プロパティに ILIst インターフェイスを実装していないクラス、かつ IEnumerable インターフェイスを実装しているクラスを設定すると、BindingSource クラスは内部でリストを作ってくれているようです(BindingSource.List プロパティに相当。IList 型のプロパティですね。実際のクラスは・・・BindingList
かなぁ?分かりません。)。で、IEnumerable.IEnumerator をくるっと回してリストにコピーにしていますよっと。(コピーっていう言葉を使うのがちょっと怖いわけですが。)なので、はじめに DataSource に設定したときに BindingSource が IEnumerable.IEnumeratorからコピーした内容はリストアップできますが、それ以降のデータへの変更は感知できなさそうです。逆に、BindingSource
に Add するという行為は内部で持っているリストに対して追加することになるため、元のデータに反映されない、という感じでしょうか。(WankumaEntertainerEnum
クラスは Add
メソッドを持っていますが、BindingSource クラスはそれを知る由もないわけですので、追加することはできませんよね。)
って、なんか・・・本末転倒!?
「IEnumerable を渡す」 → 「BindingSource がリスト作っちゃう」 → 「そいつを元のクラスに書き戻す」って流れで使用しましょうか。私ならこんな使い方するくらいなら間にBindingList 挟むことを考えるかなぁ・・・。
その12まで長々と書きました(エントリのストック切れましたw)が、.NET Framework の中の人では無いので、推測の部分もあります。そうでなくても間違ってる可能性は高いですので、ツッコミございましたらよろしくお願いします。m(_ _)m