- PR -

[vb.net]TextBox + Combobox で DataGridViewComboBoxColumn.DataPropertyName と同様な機能を実装したい

投稿者投稿内容
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-03 21:08
お世話になります。
参照先URLの方でも質問させていただいておりますが、もう1件質問です。
[OS] WindowsXP
[言語] VB 2005 sp1
にて開発しております。

DataGridViewComboBoxColumn.DataPropertyName と同様な機能を、
TextBox + ComboBox で実現したいと思っています。
そこで、System.Windows.Forms.ComboBox を継承したクラスを作成したのですが、
どうにも利用しているイベントがよくないような気がしておりまして、
アドバイスをいただきたいのです。

作成したクラスに、プロパティ "DataPropertyName As String" を作成し、
以下のようなイベントを追加しました。
 Private Sub LinkageComboBox_Enter(引数略) Handles Me.Enter
 Private Sub LinkageComboBox_Validated(引数略) Handles Me.Validated
やっていることは、"DataPropertyName" を元に、
Enterイベント で TextBox の入力結果を ComboBox に反映することと、
Validated で ComboBox の選択結果を TextBox に反映することです。

ここでこのイベントで使用している Me.Enter と Me.Validated についてなのですが、
このイベントをこのまま使用して何か問題は発生しないでしょうか?
ComboBoxクラスには、OnEnter メソッドや OnValidated メソッドが存在します。
当初、OnEnter と OnValidated によるイベントを作成したのですが、
OnValidated のイベントがうまく動かず(イベントが発生しない AddHandlerが必要?)、
最終的に上記のように作りました。
AddHandler が必要なのかと考えましたが、OnEnter は無くても動きましたので、
AddHandler Me.Validated, AddressOf ・・・ とだけ追加しても、
Enter のほうと釣り合いが取れないのでおかしいのかな、などと考えています。

「馬鹿の考え休むに似たり」といった状態です。
これじゃダメだとか、こうしたほうがいいといったアドバイスをいただけたらと思います。
よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-04 03:04
引用:

とある根性なしさんの書き込み (2007-12-03 21:08) より:

当初、OnEnter と OnValidated によるイベントを作成したのですが、
OnValidated のイベントがうまく動かず(イベントが発生しない AddHandlerが必要?)


OnEnter と OnValidated... によるイベント? どのように記述しているのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-04 11:45
じゃんぬねっとさんご返信ありがとうございます。

OnEnter と OnValided で書いたソース消してしまっていました。
比較できなければ検討もできないですよね><

再現するべくやってみましたが、なんだかうまくいきません(^^;
我ながらどうコーディングしたんだろう…
それに、改めて指摘されますと
On*** でイベントを処理しようとするのはおかしな話ですよね。
イベントを呼び出すのが仕事ですもんね。
イベントそのものではない、と。

引用:
MSDN より
OnEnter メソッドを使用すると、デリゲートを結び付けずに、派生クラスでイベントを処理することもできます。派生クラスでイベントを処理する場合は、この手法をお勧めします。



を見て(読んででなく(^^;)、
「派生クラスで Enter の処理をするときは、OnEnter を使うといいのか」
くらいに判断したのだと思います。

かなりグダグダになってしまいましたが、改めて質問させてください。
タイトルのような機能を実装するとき、
派生クラス内で、Me.*** イベントを処理するのは一般的な手法でしょうか?

申し訳ありませんが、再度よろしくお願いいたします。
#ほんと落ち着き無いなあ、自分
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-12-04 16:25
引用:

とある根性なしさんの書き込み (2007-12-03 21:08) より:

DataGridViewComboBoxColumn.DataPropertyName と同様な機能を、
TextBox + ComboBox で実現したいと思っています。



この意味がよくわかりません。
DataGridViewComboBoxColumn ではデータ入力ができないから、ComboBoxColumn を自作したいということでしょうか?
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-04 17:09
引用:

とある根性なしさんの書き込み (2007-12-04 11:45) より:

タイトルのような機能を実装するとき、派生クラス内で、Me.*** イベントを処理するのは一般的な手法でしょうか?


これは Handles 句のことでしょうか? Raise する時のお話でしょうか? イベントを処理と書かれていますので実装部分のお話に聞こえます。 イベント プロシージャではなくOn メソッドでやるべきとかそういうことでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-04 17:12
R・田中一郎さん、ご返信ありがとうございます。
私が何をやりたいのかわからない、ということですよね。

コード:

table こういうデータがあって、ComboBox コントロールに
+------+-------+  ComboBox.DataSource = table
| code | name |   ComboBox.ValueMember = "code"
+------+-------+   ComboBox.DisplayMember = "name"
| 1 | hoge1 |  上記のように設定しまして、
| 2 | hoge2 |  下記のように TextBox コントロールに "2" と入力すると、
| 3 | hoge3 | ComboBox.Text に "hoge2"(ComboBox.Value = "2" と設定)
+------+-------+ が自動で実行される、ということです。

↓入力 ↓自動表示
+--+ +-------+--+ ComboBoxに +--+ +-------+--+ 逆に、ComboBox で
| 2| | |▼| フォーカス移動 | 2| | hoge2 |▼| "hoge3" を選ぶと Valided で
+--+ +-------+--+   → +--+ +-------+--+ TextBox.Text = "3"



DataGridView は直接は関係ありません。
上記のような機能が、DataGridViewComboBoxColumn には標準で用意されているので、
同じことをしたいです。

TextBox + ComboBox の組み合わせが出てくるたびに、
イベント捉まえてコーディングすると手間になるし、間違うので、
派生クラスを作ってしまおう、と。
で、その派生クラスで Me.*** でイベントを捉まえて処理するときに、
注意事項等はないだろうか?
アドバイスがいただきたいな。
と思い、質問させていただきました。

いかがでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: とある根性なし 編集日時 2007-12-04 17:15 ]
とある根性なし
ベテラン
会議室デビュー日: 2006/08/15
投稿数: 54
投稿日時: 2007-12-04 17:28
じゃんぬねっとさん、たびたびありがとうございます。
話をするとき、いつも結論が最後になって何が言いたいのかわからん、といわれます

引用:
これは Handles 句のことでしょうか? Raise する時のお話でしょうか? イベントを処理と書かれていますので実装部分のお話に聞こえます。 イベント プロシージャではなくOn メソッドでやるべきとかそういうことでしょうか?


「Handles Me.*** を処理するのは一般的でしょうか?」です。
プラス、「イベント プロシージャではなくOn メソッドでやるべき」であるかどうか、On メソッドでやるならどうやってやるのかを知りたいです。

[Handles Me.***] を処理するとき(今回の場合は Enter and Valited)に、
たとえば MyBase.Enter に処理をやらせるべき場合があるとか、
そういったことをアドバイスしていただけたらな、と思っています。

何か自分がとても間抜けで考えが足りないような気がしてきました・・・
(おかしなこと言ってたら、是非教えてください。)
よろしくお願いいたします。

# ソースのっけてレビューしてもらったほうが早いですかね

[ メッセージ編集済み 編集者: とある根性なし 編集日時 2007-12-04 17:37 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-12-04 19:36
引用:

とある根性なしさんの書き込み (2007-12-04 17:28) より:

「Handles Me.*** を処理するのは一般的でしょうか?」です。
プラス、「イベント プロシージャではなくOn メソッドでやるべき」であるかどうか、On メソッドでやるならどうやってやるのかを知りたいです。


ComboBox を継承しているなら、普通に、OnなにがしをOverrideすればいいんじゃないでしょうか?
ComboBox を継承したクラスで TextBox をどうやって実装しているのかは不明ですが。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog

スキルアップ/キャリアアップ(JOB@IT)