2007年12月07日
DataGridViewのチェックボックスのイベントで処理をするには?
データグリッドビューにチェックボックスがあるのですが、チェックをしたタイミングでイベントを拾って処理をさせたいのです。
しかし、チェックしただけではイベントが発生しなくて、チェックボックスからロストフォーカスしたタイミングでイベントが発生するのです。
CellValueChangedイベントで悩んでいたのですがダメでした。
で、解決策ですが、
こちらが詳細のサイト
赤線を引いていますがポイントとして、
1)CellClickイベントを使用する
2)期待する値を計算する
とあります。
イベントの発生は、値が変化する前に発生するので以下の期待する値に変化させればいいわけです。
False→True または True→False
で、ソースは
Dim bln印刷区分 As Boolean
Select Case dgv.Columns(e.ColumnIndex).Name
Case "印刷区分"
bln印刷区分 = Not dgv.Rows(e.RowIndex).Cells("印刷区分").Value
'データグリッド内のチェックをON/OFFを全て行う
For i = 0 To dgv.RowCount - 1
With dgv
If str受注ID = .Rows(i).Cells("受注ID").Value Then
.Rows(i).Cells("印刷区分").Value = bln印刷区分
End If
End With
Next
End Select
上の例では、Gridにある複数の受注IDがあります。
受注IDをチェックすると、同じ受注IDが存在すれば同じチェックをつけてあげる。またははずしてあげるといった処理をしています。
bln印刷区分 = Not dgv.Rows(e.RowIndex).Cells("印刷区分").Value
ここにNOTをつけていますが、期待する値に変化させています。
FalseであればTrueとなって、TrueであればFalseになります。
SQL Server2005 + VB2005.NET のお仕事依頼お待ちしています。
(参考:新規VB2005で作成やVB6.0からVB2005へに焼き直し 等)
気軽に会社にお問合せください。
トラックバックURL
コメント一覧
1. Posted by daichan 2012年01月13日 20:00
2. Posted by 管理者 2012年01月13日 22:20
たしかに余白部分のクリックではイベントが発生しなかったと思います。
3. Posted by metroit 2012年03月22日 18:14
CellClickイベントでは、余白部分のクリックでもイベントが発生してしまう為、
実際のチェックと異なるbool値が格納されてしまいました。
ヘルプにある通り、CellContentClickイベントに記述することで上手く動きました
VB2005
実際のチェックと異なるbool値が格納されてしまいました。
ヘルプにある通り、CellContentClickイベントに記述することで上手く動きました
VB2005
4. Posted by 管理人 2012年03月22日 23:41
お仕事お疲れ様です!解決できてよかったです!
5. Posted by 通りすがりのPG 2012年10月04日 13:28
CellContentClickですが、これでは厳密には正しい値が格納できない恐れがあります。
2行分データが存在していたとします。この時1列目をID,2列目をCheckBoxとした場合、上記イベント内で、e.columunIndex=1で条件拾えば、CheckBoxセルがClickされたとしてイベントは拾えるのですが、ここでClick状態に応じて必ずしもチェック状態が反転はしない事に注意。
例えば(ライン選択有効状態で)
1行目選択状態で、1行目チェックをOFF→ONとすると、ON(変更後)が拾われます。
2行目選択状態で、1行目チェックをOFF→ONとすると、OFF(変更前)が拾われます。
2行分データが存在していたとします。この時1列目をID,2列目をCheckBoxとした場合、上記イベント内で、e.columunIndex=1で条件拾えば、CheckBoxセルがClickされたとしてイベントは拾えるのですが、ここでClick状態に応じて必ずしもチェック状態が反転はしない事に注意。
例えば(ライン選択有効状態で)
1行目選択状態で、1行目チェックをOFF→ONとすると、ON(変更後)が拾われます。
2行目選択状態で、1行目チェックをOFF→ONとすると、OFF(変更前)が拾われます。
6. Posted by 通りすがりのPG 2012年10月04日 13:46
さらに補足レスです。
イベントの遷移優先順位は、
CurrentCellChanged→CellContentClickの順番ですので、CurrentCellChangedイベント内で、現在の表内のチェック状況を変数などで常に保持しておくようにし、CellContentClickイベント内では、その変数から表示状態を取得すれば、「必ず」チェック状態変更前の値を取り出すことが可能です。
DBに直接表をリンクさせている場合はこういう心配せずともよいかと思いますが、自分で用意した値を票にセットするパターンの場合は注意が必要かと
イベントの遷移優先順位は、
CurrentCellChanged→CellContentClickの順番ですので、CurrentCellChangedイベント内で、現在の表内のチェック状況を変数などで常に保持しておくようにし、CellContentClickイベント内では、その変数から表示状態を取得すれば、「必ず」チェック状態変更前の値を取り出すことが可能です。
DBに直接表をリンクさせている場合はこういう心配せずともよいかと思いますが、自分で用意した値を票にセットするパターンの場合は注意が必要かと
7. Posted by 管理者 2012年10月26日 10:38
アドバイスサンキューです。