C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DataGridView上のチェックボックス


(過去ログ 118 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■69408 / inTopicNo.1)  DataGridView上のチェックボックス
  
□投稿者/ 長長 (3回)-(2013/12/24(Tue) 21:01:18)

分類:[VB.NET/VB2005 以降] 

Private Sub cmdCheck_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles _cmdCheck_0.Click, _cmdCheck_1.Click, _cmdCheck_2.Click
Dim Index As Short = GetIndex(eventSender)
' ■変数定義
Dim wLP_CNT As Integer = 0

For Each dgr As DataGridViewRow In DataGridView1.Rows

' ■押下されたボタンにより処理
Select Case Index
Case 0
' 全てチェック
DataGridView1(0, wLP_CNT).Value = True
Case 1
' 全て取消
DataGridView1(0, wLP_CNT).Value = False
Case 2
' チェック反転
If CType(dgr.Cells("cCheck").Value, Boolean) Then
DataGridView1(0, wLP_CNT).Value = False
Else
DataGridView1(0, wLP_CNT).Value = True
End If
End Select
wLP_CNT += 1
Next
End Sub

上記のコードで、全てチェック、全て取消はうまくいくのですが、
チェック反転(チェックがある時は「False」チェックなしの時は「True」)の
処理だけがうまく反転せず、全てにチェックが入ります。

お解りの方、よろしくお願いします。

前提条件
・環境:VB2008
 OS:Win7









引用返信 編集キー/
■69409 / inTopicNo.2)  Re[1]: DataGridView上のチェックボックス
□投稿者/ しま (56回)-(2013/12/24(Tue) 23:29:36)
No69408 (長長 さん) に返信
> Case 2
> ' チェック反転
> If CType(dgr.Cells("cCheck").Value, Boolean) Then
> DataGridView1(0, wLP_CNT).Value = False
> Else
> DataGridView1(0, wLP_CNT).Value = True
> チェック反転(チェックがある時は「False」チェックなしの時は「True」)の
> 処理だけがうまく反転せず、全てにチェックが入ります。
>
> お解りの方、よろしくお願いします。

お解りの方とのことですが、何が分かれば回答していいのですか?
チェック反転の場合の動作が期待通りでない訳が知りたいのでしょうか?
なぜ期待通りに動作しないのかはちゃんとデバッグすればすぐにわかると思いますが、少しは努力なさいましたか?
まず、

If CType(dgr.Cells("cCheck").Value, Boolean) then

の判定で何を判定したいのか説明してください。
Boolean 型かどうかで真か偽かの設定をしようとしていますがこれはあなたの意図している動作ですか?
引用返信 編集キー/
■69413 / inTopicNo.3)  Re[1]: DataGridView上のチェックボックス
□投稿者/ shu (457回)-(2013/12/25(Wed) 09:03:34)
No69408 (長長 さん) に返信

提示コードに出来るだけ近い形でのサンプルです。
cCheckの表す列が0列なのか?
折角DataGridViewRowを取得しているのにSelect内で再度
行、列指定で全体からセルを取得するのは無駄です。

    Private _Buttons() As Button

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        _Buttons = {Button1, Button2, Button3}
        For Each btn In _Buttons
            AddHandler btn.Click, AddressOf cmdCheck_Click
        Next
    End Sub

    Private Sub cmdCheck_Click(sender As Object, e As EventArgs)
        Dim Index = Array.IndexOf(_Buttons, sender)

        For Each dgr As DataGridViewRow In DataGridView1.Rows
            Select Case Index
                Case 0
                    dgr.Cells(0).Value = True
                Case 1
                    dgr.Cells(0).Value = False
                Case 2
                    If CType(dgr.Cells("cCheck").Value, Boolean) Then
                        dgr.Cells(0).Value = False
                    Else
                        dgr.Cells(0).Value = True
                    End If
            End Select
        Next
    End Sub



■No69409 (しま さん) に返信
> 
> If CType(dgr.Cells("cCheck").Value, Boolean) then
> 
> の判定で何を判定したいのか説明してください。
> Boolean 型かどうかで真か偽かの設定をしようとしていますがこれはあなたの意図している動作ですか?
この判定は型を判断しているのではなくCType(a,b)でaをb型(boolean)へキャストしているので
ここに問題はないと思います。

引用返信 編集キー/
■69414 / inTopicNo.4)  Re[2]: DataGridView上のチェックボックス
□投稿者/ しま (57回)-(2013/12/25(Wed) 10:57:22)
No69413 (shu さん) に返信
> ■No69409 (しま さん) に返信
>>
>>If CType(dgr.Cells("cCheck").Value, Boolean) then
>>
>>の判定で何を判定したいのか説明してください。
>>Boolean 型かどうかで真か偽かの設定をしようとしていますがこれはあなたの意図している動作ですか?
> この判定は型を判断しているのではなくCType(a,b)でaをb型(boolean)へキャストしているので
> ここに問題はないと思います。

そうですか。
動作結果の説明を読んで、ソースを追う限り、ここの if 文で CType() の結果が常に偽だと判定してるのではないかと
考えたのですが、まだまだ読む力が足りないようです。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -