DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SPREADのチェックボックス型列について

環境/言語:[Win 2000 Pro VB.NET]
分類:[.NET]

いつもおせわになります。 こうです。

今回質問したい事はスプレッドシートのチェックボックスの機能
なのですがよろしいでしょうか

実現したい内容
 チェックボックスでチェックされているものの行数をチェック
 ボックスが変更された時点で取得したい。

オンラインヘルプの方で調べて下記コーディングを行ったのですが

Private Sub spd_Kokyaku_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles spd_Kokyaku.EditModeOn
'Dim chkcell As FpCheckBox
Dim iRow As Integer = Insatusyori.spd_Kokyaku.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = Insatusyori.spd_Kokyaku.ActiveSheet.ActiveColumnIndex
If TypeOf (Insatusyori.spd_Kokyaku.ActiveSheet.GetCellType(iRow, iCol)) Is CheckBoxCellType Then
chkcell = CType(Insatusyori.spd_Kokyaku.EditingControl, FpCheckBox)
'イベントハンドラ関連付け
AddHandler chkcell.CheckChanged, AddressOf chkcell_CheckChanged
End If

End Sub
Private Sub chkcell_CheckChanged(ByVal sender As Object, ByVal e As System.EventArgs)

Dim i As Integer
Dim j As Integer
'j = 0
If chkcell.Checked = True Then
j = 0
For i = 0 To Insatusyori.spd_Kokyaku.Sheets(0).RowCount - 1
If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(i, 0) = True Then
j = j + 1
End If
Next
Insatusyori.lbl_Out.Text = j + 1
Else
j = 0
For i = 0 To Insatusyori.spd_Kokyaku.Sheets(0).RowCount - 1
If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(i, 0) = True Then
j = j + 1
End If
Next
If j = 0 Then
Insatusyori.lbl_Out.Text = 0
Else
Insatusyori.lbl_Out.Text = j - 1
End If
End If

End Sub

Private Sub spd_Kokyaku_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs) Handles spd_Kokyaku.EditModeOff
'Dim chkcell As FpCheckBox
Dim iRow As Integer = Insatusyori.spd_Kokyaku.ActiveSheet.ActiveRowIndex
Dim iCol As Integer = Insatusyori.spd_Kokyaku.ActiveSheet.ActiveColumnIndex
If TypeOf (Insatusyori.spd_Kokyaku.ActiveSheet.GetCellType(iRow, iCol)) Is CheckBoxCellType Then
chkcell = CType(Insatusyori.spd_Kokyaku.EditingControl, FpCheckBox)
'イベントハンドラ関連付け解除
RemoveHandler chkcell.CheckChanged, AddressOf chkcell_CheckChanged
End If
End Sub

なぜか数があわない場合があります。原因のわかる方がおられましたら
よろしくお願いします。 あと他の方法でも良いので実現方法がわかれば
お願いします。
前は長々書いて申し訳ありません。

自分なりに調べた結果 ButtonClicked イベントでもチェックボックス
のオンオフの判定は出来たのですが やはりチェックボックスのチェック
されている数の取得がうまくいきません。
(まずすべてのコンボをオンにするまではうまくいくのですが、その後
 最後にオンにしたコンボをオフにすると数が-1されず-2されています
 逆にすべてをオフにしていった場合も同様+2されます)

下記にコードを示します。

Private Sub spd_Kokyaku_ButtonClicked(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles spd_Kokyaku.ButtonClicked

Dim i As Integer
Dim j As Integer
'j = 0
If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(Insatusyori.spd_Kokyaku.Sheets(0).ActiveRowIndex, 0) = True Then
j = 0
For i = 0 To Insatusyori.spd_Kokyaku.Sheets(0).RowCount - 1
If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(i, 0) = True Then
j = j + 1
End If
Next
If j = 0 Then
Insatusyori.lbl_Out.Text = 0
Else
Insatusyori.lbl_Out.Text = j - 1
End If
Else
j = 0
For i = 0 To Insatusyori.spd_Kokyaku.Sheets(0).RowCount - 1
If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(i, 0) = True Then
j = j + 1
End If
Next
Insatusyori.lbl_Out.Text = j + 1
End If
End Sub

わかる方がいましたら何卒よろしくお願いします。
■No10018に返信(こうさんの記事)

前回、メーカーサポートは受けることはできないのですか?
と伺ったんですけどね。。
まあ私もサポートの範囲がわからないので
こういう質問に対応してくれるのかは知りませんが。

If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(Insatusyori.spd_Kokyaku.Sheets(0).ActiveRowIndex, 0) = True Then
で処理を分岐してるようですが、理由はなんですか?
最終的に「j + 1」とか「j - 1」してる理由はなんですか?
それくらいはコメントとして記述しましょう。
壱丸3さんお返事ありがとうございます

説明不足すいません。
> If Insatusyori.spd_Kokyaku.Sheets(0).GetValue(Insatusyori.spd_Kokyaku.Sheets(0).ActiveRowIndex, 0) = True Then
> で処理を分岐してるようですが、理由はなんですか?
> 最終的に「j + 1」とか「j - 1」してる理由はなんですか?
> それくらいはコメントとして記述しましょう。

+1,-1しているのはチェックボックスがおされてイベントが発生したとき
にはまだオンオフが切り替わっていない為です。

例えば チェックボックスオフ → チェックボックスクリック →
    イベント発生 →押されたチェックボックスのオンオフの判定
    → 判定はオフ

になりますのでオフの時にはプラス1 オンの時には−1してやらないと
いけないと自分は判断したのですが・・・・

何卒お願い致します。
■No10022に返信(こうさんの記事)
> +1,-1しているのはチェックボックスがおされてイベントが発生したとき
> にはまだオンオフが切り替わっていない為です。
>
> 例えば チェックボックスオフ → チェックボックスクリック →
>     イベント発生 →押されたチェックボックスのオンオフの判定
>     → 判定はオフ
>
> になりますのでオフの時にはプラス1 オンの時には−1してやらないと
> いけないと自分は判断したのですが・・・・
>
> 何卒お願い致します。

chkcell_CheckChangedが発生した時点では、
まだセルの値は変更されていないということですか。
でもchkcellってどこから参照をとってきたんでしょう?
ちゃんと目的のchkcellがとれてますか?

spd_Kokyaku_ButtonClickedのときって
セルの値って最新の状態ではないんですか?
最新の状態が取得できるのであれば分岐は不要ですよね。
SPREADのオブジェクトモデルとかイベントモデルとか全くわからないので
推測でしか言えず申し訳ないですが。。
(1回目のソースと「j + 1」「j - 1」が逆になっているのも気になりますが)
壱丸3さんの返答ありがとうございます
> spd_Kokyaku_ButtonClickedのときって
> セルの値って最新の状態ではないんですか?
> 最新の状態が取得できるのであれば分岐は不要ですよね。

自分でブレークポイントをおいてみたところは、やはりspd_Kokyaku_ButtonClicked
が発生する時点ではセルの値は変更していないみたいです。

それと一つ気づいたのですが、同じセル(チェックボックス)をオンオフに
した場合うまくいっていないことがわかりました。 他のセルをオンオフに
した場合にはうまくいくのですが・・・・
しかもブレークポイントをおいて同じセルをオンオフにしてトレースした時は
なぜだかうまくいきます。 この点もなぞですが・・・・

何度もすいませんがよろしくお願いします。
■No10027に返信(こうさんの記事)

トライアル版を入れて確認してみました。
FpSpread.ButtonClickedイベントを
ハンドルしてセルの値を確認してみましたが、
チェック状態変更後の最新の値を取得することができましたよ?

下記コードで確認してみてください。
私の環境では正しくカウントされました。
パフォーマンスは考慮してません。

(※Imports FarPoint.Win.Spread)

    'ユーザーがセルのボタン、チェックボックス、ハイパーリンクのいずれかをクリックするときに発生します。
    Private Sub FpSpread1_ButtonClicked(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles FpSpread1.ButtonClicked
        'アクティブなSheetView内のチェックされたセルをカウントして表示
        MessageBox.Show(GetCheckdCellCount(e.View.GetSheetView()).ToString())
    End Sub

    'SheetView内のチェックされたセルをカウントする
    Private Function GetCheckdCellCount(ByVal sv As SheetView) As Integer
        Dim ret As Integer = 0
        For i As Integer = 0 To sv.Rows.Count - 1
            For j As Integer = 0 To sv.Columns.Count - 1
                Dim _cell As Cell = sv.Cells(i, j)
                If TypeOf _cell.CellType Is CellType.CheckBoxCellType Then
                    ret += Convert.ToInt32(DirectCast(_cell.Value, Boolean))
                End If
            Next
        Next
        Return ret
    End Function


イベントをハンドルして処理を行う場合、
イベントデータとして渡されるオブジェクトがあればそれを活用すべきです。

あと、私が質問している「メーカーサポートは受けることはできないのですか?」に対する回答を下さいね?^^;
壱丸3さん返事遅れて申し訳ありません。

書いていただいたようにコーディングをしたところうまく
いきました 本当にありがとうございます。 コーディング
も簡潔で感動しました(^^)


> あと、私が質問している「メーカーサポートは受けることはできないのですか?」に対する回答を下さいね?^^;

回答していなくてすいません。
ライセンスが1開発ライセンスで購入しているらしく
そのライセンスは他の部署で使用しているらしくそち
らでサポートは使っている?ようです。
ちなみに1開発ライセンスでも3台にインストールでき
たんですがなんででしょうか???
解決済み!
■No10078に返信(こうさんの記事)
> 壱丸3さん返事遅れて申し訳ありません。
>
> 書いていただいたようにコーディングをしたところうまく
> いきました 本当にありがとうございます。 コーディング
> も簡潔で感動しました(^^)
>

微力ながらお役に立ててよかったです。

>>あと、私が質問している「メーカーサポートは受けることはできないのですか?」に対する回答を下さいね?^^;
>
> 回答していなくてすいません。
> ライセンスが1開発ライセンスで購入しているらしく
> そのライセンスは他の部署で使用しているらしくそち
> らでサポートは使っている?ようです。
> ちなみに1開発ライセンスでも3台にインストールでき
> たんですがなんででしょうか???

なんででしょうかと言われても・・・。^^;
でも正規ライセンスであれば、
サポートが受けられて当然でしょうし、
正規ライセンスでないなら、
それはそれで問題あると思いますが。
一度上司の方に相談してみてはいかがでしょうか?
こういったサードパーティ製のライブラリに関しては
利用者が限られるので回答がつきにくいものですし、
どうしても情報源が少ないと思いますので、
サポートは活用したほうがいいと思いますよ。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板