- PR -

DataGridViewTextBoxColumnの継承について

投稿者投稿内容
miho
常連さん
会議室デビュー日: 2007/03/10
投稿数: 24
投稿日時: 2007-03-10 09:57
はじめまして。
DataGridViewTextBoxColumnを継承したコントロールを作って、
値が入力されたら、即座に別のオブジェクトのプロパティにその値を入れたいと思っています。
イメージとしては、DataGridViewTextBoxColumnにそのオブジェクトをセットするプロパティを作って、値が入力されたらプロパティを経由して値をセットしようとしています。
(説明が下手ですいません)
http://dobon.net/vb/dotnet/datagrid/datagridcombobox.html
を参考にして作ろうとしたのですが、
DataGridViewTextBoxColumnにはCommitプロシージャがないため、できませんでした。
DataGridViewTextBoxColumnで値の入力が完了したことを知り、独自の処理をするには、何をOverridesすればよいのでしょうか。
あるいは、
http://www.vbstation.net/tips/inherits_control.htm
のように、DataGridViewの方をカスタマイズした方のがよいのでしょうか。
また、DataGridViewのコンボボックスやテキストボックスで値の変更が行われたことをキャッチするには、どのイベントが一番適切なのでしょうか。

乱文、乱筆で申し訳ありません。
よろしくお願いいたします。

KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-10 13:02
引用:

mihoさんの書き込み (2007-03-10 09:57) より:

DataGridViewTextBoxColumnを継承したコントロールを作って、
値が入力されたら、即座に別のオブジェクトのプロパティにその値を入れたいと思っています。
イメージとしては、DataGridViewTextBoxColumnにそのオブジェクトをセットするプロパティを作って、値が入力されたらプロパティを経由して値をセットしようとしています。



もちろん継承してプロパティを追加するのでも構わないのですが、
この目的だけでれば継承せずに、Tagプロパティを使うという手もあるかと思います。

引用:

また、DataGridViewのコンボボックスやテキストボックスで値の変更が行われたことをキャッチするには、どのイベントが一番適切なのでしょうか。



変更されたときであれば、CellValueChanged が普通だと思います。
miho
常連さん
会議室デビュー日: 2007/03/10
投稿数: 24
投稿日時: 2007-03-10 13:23
ありがとうございます。
Tagに入れてしまえばよいのですね。
>CellValueChanged
DataGridViewTextBoxColumnを継承したりするより、
DataGridViewにコードを書いた方がよさそうですね。
・・・DataGridも難しいなぁと思っていたのですが、
DataGridViewは私にはもっと難しいです・・・。
miho
常連さん
会議室デビュー日: 2007/03/10
投稿数: 24
投稿日時: 2007-03-10 15:09
立て続けの質問ですみません。
DataGridViewを継承したコントロールを作ろうとして、
InitializeComponentに以下のコード

MyBase.AutoGenerateColumns = False

With m_typeTable
 .Columns.Add(New DataColumn("選択種別", GetType(String)))
.Columns.Add(New DataColumn("選択種別コード", GetType(Integer)))
End With

Dim objRow1 As DataRow = m_typeTable.NewRow
Dim objRow2 As DataRow = m_typeTable.NewRow

objRow1.Item(0) = CConst.CTYPE_SINGLE
objRow1.Item(1) = 1
objRow2.Item(0) = CConst.CTYPE_MULTI
objRow2.Item(1) = 2

m_typeTable.Rows.Add(objRow1)
m_typeTable.Rows.Add(objRow2)

Dim objColumn1 As New DataGridViewComboBoxColumn
CType(objColumn1, DataGridViewComboBoxColumn).DisplayStyle =    DataGridViewComboBoxDisplayStyle.Nothing

With objColumn1
 .DataSource = m_typeTable
.DisplayMember = "選択種別"
.ValueMember = "選択種別コード"
End With

Dim objColumn2 As New DataGridViewTextBoxColumn
Dim objColumn3 As New DataGridViewTextBoxColumn

Me.Columns.Add(objColumn1)
Me.Columns.Add(objColumn2)
Me.Columns.Add(objColumn3)

を書いて実行してみたら、
DataGridViewが3列ではなく、6列できてしまいました。
コードで追加した3列の後に、コンボボックス、テキストボックス、テキストボックスという順番です。
どうしたら、余計な3列ができないようになるのでしょうか。
よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-03-10 16:04
デバッグで実行すればどこで意図しない追加がおこっているのかわかると思う。
ブレークポイントをおいてデバッグしたら?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-10 18:39
引用:

mihoさんの書き込み (2007-03-10 15:09) より:
立て続けの質問ですみません。
DataGridViewを継承したコントロールを作ろうとして、
InitializeComponentに以下のコード

(中略)

を書いて実行してみたら、
DataGridViewが3列ではなく、6列できてしまいました。



InitializeComponentはDesignerのファイルの方にあるはずですが、
これを直接編集されたということでしょうか?
自動生成されるコメントに「コード エディタを使って変更しないでください」と書いてあるはずですが。
自分で追加の初期化を行いたいなら、コンストラクタのInitializeComponent呼び出しの後に書くのが普通です。
通常列の追加はデザイナで行い、それがInitializeComponentに自動反映されます。

ただし、それとは関係なく、この現象は私も経験しています。
DataGridViewを継承したコントロールで列を追加し、それをフォームに配置すると
フォームをデザイナで開いて保存するたびに列が増えていく
というものです。
疑問に思っていましたが、仕様なのかなと思い諦めています。
デザイナで開いて保存するたびに、列が3列ずつ増えていきませんか?
デザイナを開くたびに列の追加の部分のコードが実行されるようです。

どなたか情報お持ちの方いらっしゃいましたら、フォローお願いします。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-03-10 23:42
DataGridViewを継承したコントロールを利用していますが、
mihoさんやKIさんの言われる現象にはまだ遭遇していません。
引用:
KIさんの書き込み(2007-03-10 18:39)より:
InitializeComponentはDesignerのファイルの方にあるはずですが、


やりかたによっては同一ファイル内部にInitializeComponentメソッドは追加されます。
プロジェクトにコントロールでなくクラスを追加し、その後Inheritsを記述した場合ですね。
この場合は「コードエディタ〜」の件は記述されません。
(designerファイルが存在しない状態)

実際のロジック次第ですが、継承したコントロールを配置したフォームにおいて、
フォームのInitializeComponentメソッド内部に、コントロールにて記述した
InitializeComponentメソッドと同様のロジックが追加されているのではないかな、と思います。

# あまり検証できてないですが、属性かなにかで制御するのかなぁ・・・と。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-03-11 01:20
引用:

Ahfさんの書き込み (2007-03-10 23:42) より:
やりかたによっては同一ファイル内部にInitializeComponentメソッドは追加されます。
プロジェクトにコントロールでなくクラスを追加し、その後Inheritsを記述した場合ですね。



その通りですね。失念していました。
今は検証する時間がないのですが、コントロールではなくクラスを追加した場合は
この事象起きないんでしょうか…?
明日、時間があったら試してみます。

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