前回は、SPREADを使ってデータの一覧を表示し、セルダブルクリック(CellDoubleClick)もしくはキーダウン(KeyDown)イベント時に メッセージボックスを表示するという簡単な処理を行いました。
今回は少し進んで、セルダブルクリック及びキーダウンイベント時に、別フォームを作成し表示させてみます。 別フォームには3個のラベルを貼って、データ一覧の各カラムの内容を表示します。
フォームロード時にSPREADの初期化などは前回までと同様ですが、データ表示用の関数(DisplayOneData)を新規に作成し 行番号を引数で渡すことで別フォーム(Form2)を生成後、その行番号の各カラム値を3個のラベルに設定しています。 別フォームは「Show」メソッドで表示しています。
下図は、フォーム表示後、5行目をダブルクリックしてForm2を表示した時の表示です。
しかし、実際の動作としては、Form1でダブルクリック後、Form2が表示されるのですが、 フォーカスは依然としてForm1にあり、Form2はForm1の下に表示されます。 (キーダウン時の方は、Form2はForm1の上に表示されます)
この現象を避けるには、ダブルクリック時処理を以下の様にし、データ表示のフォーム表示メソッドを「ShowDialog」に変更することです。
もう一つ解決策がありまして、フォームの表示メソッドを「Show」のままで行う方法です。
ダブルクリック時にダブルクリックが在った証拠フラグをONし、 マウスアップ時にダブルクリックフラグがONならば、データ表示を行う様にすることです。 (マウスアップ時には、Form1からフォーカスが無くなる様です。)
一覧データ表示移行の部分を、以下のソースの様にします。
=====
2016/03/04:の時の情報
今回は少し進んで、セルダブルクリック及びキーダウンイベント時に、別フォームを作成し表示させてみます。 別フォームには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
コメント