前回は、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
コメント