- PR -

DataGridViewの編集中の値を取得したい(チェックボックス)

投稿者投稿内容
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-23 15:29
お世話になります。

.netのDataGridViewで編集中の値(鉛筆表示時)を取得したいです。
クリックイベント等にDataGridView(x,y).valueで値を取得すると確定されている
値が取れてしまいます。
やりたいことは以下です。

.netのDataGridViewに配置されているチェックボックスは表示が3段階
でクリックでは2段階にしたいです。

<チェックボックス例>
0・・・False
1・・・中間(グレー)←クリックではここをすっ飛ばしたい
2・・・True

なので、ClickやCellValidatedイベント等で編集中の値が1だったら2にしたいのですが値がうまく取れません。
どなたかヒントを与えてください。




[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-23 15:31 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-23 16:45
DataGridViewCheckBoxCell.ThreeState プロパティ

これを false にすればいいとかいう話ではないですか?
(というか既定値は false のはずなんですが)
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-23 17:24
お!KIさんこんにちは。書き込みありがとうございます。

引用:

KIさんの書き込み (2007-05-23 16:45) より:
これを false にすればいいとかいう話ではないですか?
(というか既定値は false のはずなんですが)



falseにすればチェックボックスは二段階ですよね。
表示上、中間(グレー)の三段階を表示する場合が必要で、
クリックしたときはチェックとチェックなしの二段階になるようにしたいのです。
ちょっと説明しにくいのですが・・・。


こういうデータが合った場合
<データ>
chk     id       value
---------+------------+----------
1      a         みかん   -@
0      a         りんご   -A
1      b         メロン

表示上はidで集約されて以下↓のように表示
<グリッド上>
chk     id       value     詳細
---------+------------+----------+--------
グレー    a         ・・・   ボタン      ←@Aが集約されて表示
1       b        メロン

ボタンを押すと@Aだけが表示される詳細画面に遷移します。ちなみに詳細画面は
二段階のチェックボックスです。(本題に関係ありませんが)

id=aのチェックはONとOFFがあるので画面ではグレーのチェックとなります。
ここで「グレー」をクリックするとチェックが外れてチェックなしになって
データはこうなります。

<データ>
chk     id       value
---------+------------+----------
0      a          みかん   -@
0      a          りんご   -A
1      b          メロン

これが表示上3段階、クリックでは2段階という意味です。伝わりますでしょうか?
クリックではグレーが選択できないようにしたいのです。

ここでは
0・・・false
1・・・Trueとします


[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-23 17:26 ]

[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-23 17:27 ]

[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-23 17:34 ]
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-05-23 20:11
DataGridViewCheckBoxCell.EditingCellFormattedValue プロパティで拾えますよ。

CellClickイベントでは「変更される前の値」なのでちょっとアレですが、
CellValidatingイベントなら恐らく希望の値を拾えると思います。
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-23 20:59
書き込みありがとうございます。

引用:

Ahfさんの書き込み (2007-05-23 20:11) より:
DataGridViewCheckBoxCell.EditingCellFormattedValue プロパティで拾えますよ。



???

そもそも、グリッドの定義の方法に問題があるのでしょうか?↑の説明を読んでも
繋がりが理解できないです。
ちなみにグリッドは

<ソース>****************************************************
インスタンス = New Windows.Forms.DataGridViewCheckBoxColumn
'型を指定してカラム追加
DataGridView1.Columns.Add(インスタンス)
*************************************************************

という具合に定義していてDataGridView自体はインスタンス化せず
DataGridView1(x,y).value 等というようにコーディングしているのが
まずいのでしょうか?

DataGridViewCheckBoxCellとDataGridView1はどのように結びつくのかが分からないです。
どのようなインスタンスの定義にすればDataGridViewCheckBoxCellを扱えるのかが
分からない点です。

ちなみにグリッドに定義するときはDataGridViewCheckBoxColumnではなく
DataGridViewCheckBoxCellが正解ということでしょうか。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-23 23:34
引用:

ちなみにグリッドは

<ソース>****************************************************
インスタンス = New Windows.Forms.DataGridViewCheckBoxColumn
'型を指定してカラム追加
DataGridView1.Columns.Add(インスタンス)
*************************************************************

という具合に定義していてDataGridView自体はインスタンス化せず
DataGridView1(x,y).value 等というようにコーディングしているのが
まずいのでしょうか?


本題と直接関係ないですが、
DataGridView をインスタンス化してないなんてことはないはずですよ。
フォームに表示されているのですから、インスタンス化されています。
デザイナが自動生成したコード内だとは思いますが。
DataGridView1(x,y).value の DataGridView1 というのがそのインスタンスです。

引用:

DataGridViewCheckBoxCellとDataGridView1はどのように結びつくのかが分からないです。
どのようなインスタンスの定義にすればDataGridViewCheckBoxCellを扱えるのかが
分からない点です。

ちなみにグリッドに定義するときはDataGridViewCheckBoxColumnではなく
DataGridViewCheckBoxCellが正解ということでしょうか。


DataGridView は DataGridView そのもの、
DataGridViewColumn は DataGridView の列、
DataGridViewCell は DataGridView の1つのセルです。
ビンさんが書いた「DataGridView1(x,y).value」の
DataGridView1(x, y) は DataGridViewCell です。
ですから、意識はされていないかも知れませんが、使用していますね。

ちなみに DataGridViewCheckBoxColumn は DataGridViewColumn のサブクラスで、
DataGridViewCheckBoxCell は DataGridViewCell のサブクラスです。
ということなので、CellClick とか CellValidated イベント内でアクセスするには、
EventArgs を e として

コード:

Dim cell As DataGridViewCheckBoxCell = _
DirectCast(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell)

If cell.EditingCellFormattedValue = 1 Then

End If




みたいなイメージです。

#CODE タグの記述をミスしていたので修正しました

[ メッセージ編集済み 編集者: KI 編集日時 2007-05-23 23:39 ]
ピン
会議室デビュー日: 2007/05/16
投稿数: 18
投稿日時: 2007-05-24 11:25
ありがとうございます。編集中の値は取得できました。
しかし、値の設定がうまくいきませんでした。

引用:

KIさんの書き込み (2007-05-23 23:34) より:

コード:

Dim cell As DataGridViewCheckBoxCell = _
DirectCast(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell)

If cell.EditingCellFormattedValue = 1 Then

End If




[ メッセージ編集済み 編集者: KI 編集日時 2007-05-23 23:39 ]



<ソース>******************************
CellMouseClickイベントにしました。

Dim cell As DataGridViewCheckBoxCell = _
DirectCast(DataGridView1(e.ColumnIndex, e.RowIndex), DataGridViewCheckBoxCell)

'TRUEの時にクリックしたときはグレーをすっ飛ばす
If Convert.ToInt16(cell.EditingCellFormattedValue) = 1 Then・・・※A
 @DataGridView1(e.ColumnIndex, e.RowIndex).Value = 0
 Acell.Value = 0
 Bcell.EditingCellFormattedValue = cell.FalseValue
End If

***************************************
値は
0:False・・・チェックなし
1:True・・・チェックあり
2:IndeterminateValue・・・グレー
としています。

※AのIF条件はここでは触れないこととします。

値のセットを@ABを試しましたが、グリッドに反映されません。
Bに関してはオブジェクトの型エラーになってしまいます。

cell.EditingCellFormattedValue は
Checked{1}といった型で

cell.IndeterminateValueは
"0"{Sting}という型になっているからです。

どうって事ない制御に思われるのですが、苦戦してしまっています。





[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-24 11:26 ]

[ メッセージ編集済み 編集者: ピン 編集日時 2007-05-24 11:28 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-25 09:31
すみません。検証してたら私がハマってしまいましたw

確かに、大した制御でないような気はするんですけどね。
あと一息というところで、うまくいきませんでした。
とりあえずヒントになりそうなことだけ書いておきます。
あまり力になれず申し訳ありません。

他に詳しい方いらっしゃったらフォローお願いします。

ビンさんがおっしゃる型エラーに関して言えば、
デザイナで TrueValue 等を設定すると文字列として
設定されるから問題なのではないかと思います。
コードから数字か CheckState で設定してあげるとよいと思います。

ただし、CellMouseClick とかで値を書き換えると、
その後にクリックで値が変わってしまうので上手くいかないようです。

DataGridView.CellValueChanged イベント

ここにチェックボックスセルについての記述がありますので、
CellValueChanged でやるのも1つの手かと思います。
他に、CellParsing、CellFormatting イベントを使う手も考えられます。

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