忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:Spread(GrapeCity)データ一覧表示での行選択処理(CellDoubleClickイベント , KeyDownイベント)その2
前回は、SPREADを使ってデータの一覧を表示し、セルダブルクリック(CellDoubleClick)もしくはキーダウン(KeyDown)イベント時に メッセージボックスを表示するという簡単な処理を行いました。

今回は少し進んで、セルダブルクリック及びキーダウンイベント時に、別フォームを作成し表示させてみます。 別フォームには3個のラベルを貼って、データ一覧の各カラムの内容を表示します。

フォームロード時にSPREADの初期化などは前回までと同様ですが、データ表示用の関数(DisplayOneData)を新規に作成し 行番号を引数で渡すことで別フォーム(Form2)を生成後、その行番号の各カラム値を3個のラベルに設定しています。 別フォームは「Show」メソッドで表示しています。

Imports FarPoint.Win
Public Class Form1
    'フォームロード時にSPREADの初期化
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'SPREADの設定
        With Me.FpSpread1
            'スクロールバーの設定
            .HorizontalScrollBarPolicy = Spread.ScrollBarPolicy.AsNeeded
            .VerticalScrollBarPolicy = Spread.ScrollBarPolicy.AsNeeded
            '分割ボックスの設定
            .ColumnSplitBoxPolicy = Spread.SplitBoxPolicy.Never
            .RowSplitBoxPolicy = Spread.SplitBoxPolicy.Never
            'カーソル設定
            .SetCursor(Spread.CursorType.Normal, Windows.Forms.Cursors.Arrow)
            .SetCursor(Spread.CursorType.LockedCell, Windows.Forms.Cursors.Arrow)
            'セルがアクティブ時に編集モードにしない
            .EditModePermanent = False
            'セルがアクティブ時に既存の内容を選択しない
            .EditModeReplace = False
        End With
        'アクティブシートの設定
        With Me.FpSpread1.ActiveSheet
            '選択状態
            .SelectionStyle = Spread.SelectionStyles.SelectionRenderer
            '編集モードの設定
            .OperationMode = Spread.OperationMode.SingleSelect
            '列のサイズ変更可、行のサイズ変更不可に設定する。
            .Columns.Default.Resizable = True
            .Rows.Default.Resizable = False
            'SPREADのアクティブシートのカラム数を3に設定
            .ColumnCount = 3
            'SPREADの行クリア
            .RowCount = 0
        End With

        '一覧データ表示
        Call Me.DisplayData()
    End Sub

    '一覧データ表示
    Private Sub DisplayData()
        'ソースが長くなるのでWith宣言
        With Me.FpSpread1.ActiveSheet
            '描画を停止させる
            Me.FpSpread1.SuspendLayout()
            'データの行数分の処理
            For i As Integer = 0 To 999
                '行数を増やす
                .RowCount += 1
                '各セルへのデータ設定
                .SetText(i, 0, "A" & i.ToString("000"))
                .SetText(i, 1, "B" & i.ToString("000"))
                .SetText(i, 2, "C" & i.ToString("000"))
            Next
        End With
        '描画を再開させる
        Me.FpSpread1.ResumeLayout(True)
        '先頭行を選択設定(1行目が選択色になる)
        Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1)
    End Sub

    'Spreadダブルクリック時処理 
    Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object,
             ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick
        'ヘッダーダブルクリックの場合抜ける
        If e.ColumnHeader = True Then
            Return
        End If
        'シートにデータ行が在るか??
        If FpSpread1.ActiveSheet.RowCount > 0 Then
            'データ表示
            Call DisplayOneData(e.Row)
        End If
    End Sub

    'Spread KeyDown時処理
    Private Sub FpSpread1_KeyDown(ByVal sender As Object,
               ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyDown
        'Enterキー押下したとき
        If e.KeyCode = Windows.Forms.Keys.Enter Then
            'データ表示
            Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex)
        End If
    End Sub

    'データ表示
    Private Sub DisplayOneData(ByVal nRow As Integer)
        Dim form2 As New Form2
        With form2
            .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0)
            .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1)
            .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2)
            .Show()
        End With
    End Sub
End Class

下図は、フォーム表示後、5行目をダブルクリックしてForm2を表示した時の表示です。
しかし、実際の動作としては、Form1でダブルクリック後、Form2が表示されるのですが、 フォーカスは依然としてForm1にあり、Form2はForm1の下に表示されます。 (キーダウン時の方は、Form2はForm1の上に表示されます)

この現象を避けるには、ダブルクリック時処理を以下の様にし、データ表示のフォーム表示メソッドを「ShowDialog」に変更することです。
    'Spreadダブルクリック時処理 
    Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object,
            ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick
        'ヘッダーダブルクリックの場合抜ける
        If e.ColumnHeader = True Then
            Return
        End If
        'シートにデータ行が在るか??
        If FpSpread1.ActiveSheet.RowCount > 0 Then
            'デフォルト処理のキャンセル
            e.Cancel = True
            'データ表示
            Call DisplayOneData(e.Row)
        End If
    End Sub

    'データ表示
    Private Sub DisplayOneData(ByVal nRow As Integer)
        Dim form2 As New Form2
        With form2
            .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0)
            .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1)
            .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2)
            .ShowDialog()
        End With
    End Sub


もう一つ解決策がありまして、フォームの表示メソッドを「Show」のままで行う方法です。
ダブルクリック時にダブルクリックが在った証拠フラグをONし、 マウスアップ時にダブルクリックフラグがONならば、データ表示を行う様にすることです。 (マウスアップ時には、Form1からフォーカスが無くなる様です。)

一覧データ表示移行の部分を、以下のソースの様にします。
    'ダブルクリックフラグ
    Private isSpdCellDoubleClick As Boolean = False

    'Spreadダブルクリック時処理 
    Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object,
              ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick
        'ヘッダーダブルクリックの場合抜ける
        If e.ColumnHeader = True Then
            Return
        End If
        'シートにデータ行が在るか??
        If FpSpread1.ActiveSheet.RowCount > 0 Then
            'デフォルト処理のキャンセル
            e.Cancel = True
            'ダブルクリックフラグON
            isSpdCellDoubleClick = True
        End If
    End Sub

    'Spreadマウスアップ時処理
    Private Sub FpSpread1_MouseUp(ByVal sender As System.Object,
                   ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseUp
        If Me.isSpdCellDoubleClick = True Then
            'データ表示
            Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex)
        End If
        'ダブルクリックフラグOFF
        Me.isSpdCellDoubleClick = False
    End Sub

    'Spread KeyDown時処理
    Private Sub FpSpread1_KeyDown(ByVal sender As Object,
                    ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyDown
        'Enterキー押下したとき
        If e.KeyCode = Windows.Forms.Keys.Enter Then
            'データ表示
            Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex)
        End If
    End Sub

    'データ表示
    Private Sub DisplayOneData(ByVal nRow As Integer)
        Dim form2 As New Form2
        With form2
            .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0)
            .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1)
            .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2)
            .Show()
        End With
    End Sub




=====
2016/03/04:の時の情報











PR

コメント

コメントを書く