とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

データバインディングのおべんきょ。その12。

データバインディングのおべんきょ。その11。

前回までのあらすじ

あれ?また 'とりこびと' いないYO!

そうです。元の IEnumerable な WankumaEntertainerEnum に要素を追加しても、ComboBox には反映されなかったのです。残念無念。・・・って忘れてませんか?ここでやったことを。それって、

BindingSource に追加するんやないの?

そうでした。BindingSource 経由でやればなんでもかんでもやってくれそうでした!なので、前回の Button1_Click を以下の内容に変更します。

Private Sub Button1_Click(ByVal sender As System.ObjectByVal 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.ObjectByVal 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

投稿日時 : 2007年6月4日 16:33

Feedback

# re: データバインディングのおべんきょ。その12。 2007/06/04 16:35 とりこびと

いくら書いてもネタ自体は尽きないのがデータバインディングでした、という教訓ですかねw

# re: データバインディングのおべんきょ。その12。 2007/06/04 20:27 えムナウ

>元の IEnumerable な WankumaEntertainerEnum に要素を追加しても、ComboBox には反映されなかったのです。
>エントリのストック切れましたw
ということですのでIEnumerableじゃ本来機能不足なんですがこんなのをどうぞ。

Me._entertainerEnum.Add(New WankumaEntertainer("とりこびと"))
Me._entertainersBindingSource.DataSource = Nothing
Me._entertainersBindingSource.DataSource = Me._entertainerEnum

# re: データバインディングのおべんきょ。その12。 2007/06/04 21:15 とりこびと

えムナウ さん、コメントありがとうございます。

余裕があれば書こうとは思っていたのですが(^^;
提示いただいた内容で、

>Me._entertainersBindingSource.DataSource = Nothing

なのが、
「なんだかヤダな・・・。できれば使いたくないな・・・。」
って思いの下にエントリには含めませんでした。orz

それ以外にも、以前のResetBinding メソッドのときも思ったのですが、
データバインディングに関する処理をできれば書きたくない
(.NET Framework に任せてしまいたい、という意味で)
と思うところが大きいのが本音ですね。
相応のクラスを用意したらあとは任せとけばOK!みたいな・・・。(お決まりコードほどウッカリしやすいのでw)

なので、数回のエントリでも上記の意味でめんどくさい場合のエントリは若干テンションが低めになってしまいました。

自分の好みで情報量が増減してしまったのは反省点ですね。

# re: データバインディングのおべんきょ。その12。 2007/06/05 1:10 えムナウ

今までの成果を表にまとめられると、
すてきだなっと言ってみる。

# re: データバインディングのおべんきょ。その12。 2007/06/05 9:15 とりこびと

えムナウ さん、コメントありがとうございます。

>今までの成果を表にまとめられると、
>すてきだなっと言ってみる。

そうですね。まとめてみます。m(_ _)m

# ほんとはもう少し(Datasetの場合とか)いきたいんですけど・・・。

タイトル  
名前  
Url
コメント