DataGridで指定セルごとに処理を変えるには?


saru  2006-05-17 03:51:59  No: 131450

VB.NET 2003/WinXP

DataGridコントロールの検証をしています。

http://dobon.net/vb/dotnet/datagrid/datagridcombobox.html
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2062060
上記を参考にDataGridの指定したセルにコンボボックスを表示させることはできました。

1.その他に例えば上記を参考に作成した指定セルにコンボボックスを表示させ  るカラムがあります。
  そのカラムのコンボボックスが表示されていないないセルを編集して
  通常通り更新されるようにしたりすることはできるのでしょうか?

  現状は読み取り専用のような状態で入力はできるのですが↓ボタンを
  押すと元にもどってしまいます。
  単純にできる事なのでしょうか?複雑なことでしょうか?
  この状態でどうにかできるのではないかと思いソースに手を加えましたが
  うまくいきませんでした。

2.1で示したようなカラムでコンボボックス表示されるセルをダブルクリック  したら入力もできるようにすることなどは可能なのでしょうか?

  これがうまくいけばいろいろなことができるような気がするのですが、どなたかご存知の方がいらっしゃいましたらご教授ください。

宜しくお願い致します。


特攻隊長まるるう  2006-05-18 00:35:35  No: 131451

>1.
もともと、継承している DataGridTextBoxColumn クラスのヘルプを
読み、実際にそのクラスでテストすれば、それがどんなものか?
どんな動きか?質問するよりもよく分かると思います。
[ヘルプの表示の仕方]
DataGridTextBoxColumn と記述している部分を選択して[F1]キー

簡単に言えば、データのテキスト編集ができる DataGrid の列は、特に
コードから指定していなくても DataGridTextBoxColumn が自動で作ら
れて、データの編集ができるようになっていると思います。その際、テキスト
ボックスを自動で表示して、そのテキストボックス(Me.TextBox)と連携を
取ることにより、編集できているように見せている…という表現が近いで
しょうか?

DOBON さんのサンプルの DataGridComboBoxColumn クラスは、この
テキストボックスとのやり取りをコンボボックスに置き換えています。
その際、本来表示されるべきテキストボックスは使わないので、当然
非表示にしています。

この部分を正しく理解すれば、コンボボックスを表示していないセルは
『本来の DataGridTextBoxColumn の動きに戻してやる』
必要があることが分かります。

# ReadOnly とかの設定もあり、どんなクラスを使ってて、どんな設定が
あるかを一通りは知っておかないと、DataSource の設定が悪くて
自動で読取専用の列になってた…とかいうオチも有り得ますよね?
[ヘルプで調べるページ]
DataGridTextBoxColumn メンバ

>2.
まぁ、これもダブルクリックのイベントから調べないと…


特攻隊長まるるう  2006-05-18 00:40:31  No: 131452

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200605/06050035.txt
↑で答えた
>条件が行数なら _rowNumber を使ってるところ全部じゃ
>ないんですか?
の『全部』ってのは結構重要で、実は奥が深いんです。コンボボックスが表示されない
だけではダメですね。本来の動きを殺している部分をもとに戻さないと…つまり編集
作業も対応できないと。


特攻隊長まるるう  2006-05-18 02:48:32  No: 131453

ちなみにヒント。
[VB.NET]
        Protected Overrides Function Commit( _
                ByVal dataSource As CurrencyManager, _
                ByVal rowNum As Integer) As Boolean

            Return MyBase.Commit(dataSource, rowNum)

        End Function

意味は、基本クラス(DataGridTextBoxColumn)から継承したメンバ(Commit)を
オーバーライド(上書き)してるので、関数内に何も書かなければ、本来の処理が
何も実行されないんだけど、MyBase の Commit に引数をそのまま渡してやって
いるので、本来の処理が実行されるはずのコードです(たまにうまく動かないケース
があるんですが(汗))
Return で呼び出してるのは戻り値を返すためです。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加