- - PR -
DataGridViewの編集中の値を取得したい(チェックボックス)
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2007-05-23 16:45
DataGridViewCheckBoxCell.ThreeState プロパティ
これを false にすればいいとかいう話ではないですか? (というか既定値は false のはずなんですが) | ||||||||||||
|
投稿日時: 2007-05-23 17:24
お!KIさんこんにちは。書き込みありがとうございます。
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 ] | ||||||||||||
|
投稿日時: 2007-05-23 20:11
DataGridViewCheckBoxCell.EditingCellFormattedValue プロパティで拾えますよ。
CellClickイベントでは「変更される前の値」なのでちょっとアレですが、 CellValidatingイベントなら恐らく希望の値を拾えると思います。 | ||||||||||||
|
投稿日時: 2007-05-23 20:59
書き込みありがとうございます。
??? そもそも、グリッドの定義の方法に問題があるのでしょうか?↑の説明を読んでも 繋がりが理解できないです。 ちなみにグリッドは <ソース>**************************************************** インスタンス = New Windows.Forms.DataGridViewCheckBoxColumn '型を指定してカラム追加 DataGridView1.Columns.Add(インスタンス) ************************************************************* という具合に定義していてDataGridView自体はインスタンス化せず DataGridView1(x,y).value 等というようにコーディングしているのが まずいのでしょうか? DataGridViewCheckBoxCellとDataGridView1はどのように結びつくのかが分からないです。 どのようなインスタンスの定義にすればDataGridViewCheckBoxCellを扱えるのかが 分からない点です。 ちなみにグリッドに定義するときはDataGridViewCheckBoxColumnではなく DataGridViewCheckBoxCellが正解ということでしょうか。 | ||||||||||||
|
投稿日時: 2007-05-23 23:34
本題と直接関係ないですが、 DataGridView をインスタンス化してないなんてことはないはずですよ。 フォームに表示されているのですから、インスタンス化されています。 デザイナが自動生成したコード内だとは思いますが。 DataGridView1(x,y).value の DataGridView1 というのがそのインスタンスです。
DataGridView は DataGridView そのもの、 DataGridViewColumn は DataGridView の列、 DataGridViewCell は DataGridView の1つのセルです。 ビンさんが書いた「DataGridView1(x,y).value」の DataGridView1(x, y) は DataGridViewCell です。 ですから、意識はされていないかも知れませんが、使用していますね。 ちなみに DataGridViewCheckBoxColumn は DataGridViewColumn のサブクラスで、 DataGridViewCheckBoxCell は DataGridViewCell のサブクラスです。 ということなので、CellClick とか CellValidated イベント内でアクセスするには、 EventArgs を e として
みたいなイメージです。 #CODE タグの記述をミスしていたので修正しました [ メッセージ編集済み 編集者: KI 編集日時 2007-05-23 23:39 ] | ||||||||||||
|
投稿日時: 2007-05-24 11:25
ありがとうございます。編集中の値は取得できました。
しかし、値の設定がうまくいきませんでした。
<ソース>****************************** 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 ] | ||||||||||||
|
投稿日時: 2007-05-25 09:31
すみません。検証してたら私がハマってしまいましたw
確かに、大した制御でないような気はするんですけどね。 あと一息というところで、うまくいきませんでした。 とりあえずヒントになりそうなことだけ書いておきます。 あまり力になれず申し訳ありません。 他に詳しい方いらっしゃったらフォローお願いします。 ビンさんがおっしゃる型エラーに関して言えば、 デザイナで TrueValue 等を設定すると文字列として 設定されるから問題なのではないかと思います。 コードから数字か CheckState で設定してあげるとよいと思います。 ただし、CellMouseClick とかで値を書き換えると、 その後にクリックで値が変わってしまうので上手くいかないようです。 DataGridView.CellValueChanged イベント ここにチェックボックスセルについての記述がありますので、 CellValueChanged でやるのも1つの手かと思います。 他に、CellParsing、CellFormatting イベントを使う手も考えられます。 |