- - PR -
DataGridViewTextBoxColumnの継承について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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のコンボボックスやテキストボックスで値の変更が行われたことをキャッチするには、どのイベントが一番適切なのでしょうか。 乱文、乱筆で申し訳ありません。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-03-10 13:02
もちろん継承してプロパティを追加するのでも構わないのですが、 この目的だけでれば継承せずに、Tagプロパティを使うという手もあるかと思います。
変更されたときであれば、CellValueChanged が普通だと思います。 | ||||||||
|
投稿日時: 2007-03-10 13:23
ありがとうございます。
Tagに入れてしまえばよいのですね。 >CellValueChanged DataGridViewTextBoxColumnを継承したりするより、 DataGridViewにコードを書いた方がよさそうですね。 ・・・DataGridも難しいなぁと思っていたのですが、 DataGridViewは私にはもっと難しいです・・・。 | ||||||||
|
投稿日時: 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列ができないようになるのでしょうか。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-03-10 16:04
デバッグで実行すればどこで意図しない追加がおこっているのかわかると思う。
ブレークポイントをおいてデバッグしたら? | ||||||||
|
投稿日時: 2007-03-10 18:39
InitializeComponentはDesignerのファイルの方にあるはずですが、 これを直接編集されたということでしょうか? 自動生成されるコメントに「コード エディタを使って変更しないでください」と書いてあるはずですが。 自分で追加の初期化を行いたいなら、コンストラクタのInitializeComponent呼び出しの後に書くのが普通です。 通常列の追加はデザイナで行い、それがInitializeComponentに自動反映されます。 ただし、それとは関係なく、この現象は私も経験しています。 DataGridViewを継承したコントロールで列を追加し、それをフォームに配置すると フォームをデザイナで開いて保存するたびに列が増えていくというものです。 疑問に思っていましたが、仕様なのかなと思い諦めています。 デザイナで開いて保存するたびに、列が3列ずつ増えていきませんか? デザイナを開くたびに列の追加の部分のコードが実行されるようです。 どなたか情報お持ちの方いらっしゃいましたら、フォローお願いします。 | ||||||||
|
投稿日時: 2007-03-10 23:42
DataGridViewを継承したコントロールを利用していますが、
mihoさんやKIさんの言われる現象にはまだ遭遇していません。
やりかたによっては同一ファイル内部にInitializeComponentメソッドは追加されます。 プロジェクトにコントロールでなくクラスを追加し、その後Inheritsを記述した場合ですね。 この場合は「コードエディタ〜」の件は記述されません。 (designerファイルが存在しない状態) 実際のロジック次第ですが、継承したコントロールを配置したフォームにおいて、 フォームのInitializeComponentメソッド内部に、コントロールにて記述した InitializeComponentメソッドと同様のロジックが追加されているのではないかな、と思います。 # あまり検証できてないですが、属性かなにかで制御するのかなぁ・・・と。 | ||||||||
|
投稿日時: 2007-03-11 01:20
その通りですね。失念していました。 今は検証する時間がないのですが、コントロールではなくクラスを追加した場合は この事象起きないんでしょうか…? 明日、時間があったら試してみます。 |