-
前回は、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 -
SPREADを使ってマスタメンテナンスのマスタデータの一覧を表示した時に、行選択して何かを行いたい場合があります。 この場合には、セルダブルクリック(CellDoubleClick)もしくはキーダウン(KeyDown)イベント時にその処理を書きます。
以下のソースの説明ですが、SPREADコントロールのアクティブシートの「OperationMode」プロパティを「SingleSelect」に設定することで、 1行の選択が出来る様になります。選択された行はデフォルトでは薄い青色になり、選択されている状態がわかります。
SPREADコントロールの各種のプロパティの設定し、アクティブシートの設定を行った後で テストデータの一覧表示を行っています。
一覧表示の最後で、「AddSelection」により行選択を強制的に行っていますが、 この処理が無いと、最初に一覧を表示した時に選択状態の表示にならないので注意が必要です。
セルダブルクリック及び、キーダウンイベントでアクティブな行の第1カラム目のデータを単にメッセージボックスで 表示させるだけの簡単な処理を行います。
尚、セルダブルクリック時にはヘッダーダブルクリックの場合には処理を行わない様にします。
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 'セルダブルクリック時処理 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 'Spreadからコードの取得 Dim str As String = "第1カラムデータ = " & _ Me.FpSpread1.ActiveSheet.GetValue(e.Row, 0) MsgBox(str) End If End Sub 'キーダウン時処理 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 'Spreadからコードの取得 Dim str As String = "第1カラムデータ = " & _ Me.FpSpread1.ActiveSheet.GetValue(Me.FpSpread1.ActiveSheet.ActiveRowIndex, 0) MsgBox(str) End If End Sub End Class
下図は、フォーム表示後、2行目をダブルクリックしてメッセージボックスを表示した時の表示です。
=====
2016/02/29:の時の情報
-
SPREADのアクティブシートへ設定した文字列データが、 セル上に収まりきらない場合テキストチップとして表示させることができます。
SPREADコントロールの「TextTipPolicy」プロパティを「Floating」に設定することで、 セル上にマウスを移動した時に、セルに設定されている文字列がテキストチップとして表示されます。
以下のソースでは、TextTipFetchイベントでの処理を行うことで、 セルのTextに設定された文字列とは別のものを表示する処理を行っています。
フォームロード時にSPREADの初期化を行い、 アクティブシートのカラム数を6に設定し、ヘッダ行数を0でクリア設定しています。 また、「TextTipPolicy」プロパティを「Floating」に設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。 行の追加した後で、3個のセルに対して別々の値を設定しています。 2カラム目の「Tag」にテキストチップとして表示する文字列を設定しています。
「TextTipFetch」イベントでは対象となる2カラム目の場合のみ「Tag」から表示文字列を取得し チップテキストに設定しています。尚、カラムフッタ、カラムヘッダ、行ヘッダは処理を省いています。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADのアクティブシートのカラム数を3に設定 Me.FpSpread1.ActiveSheet.ColumnCount = 3 'SPREADの行クリア Me.FpSpread1.ActiveSheet.RowCount = 0 'TextTip表示指定 Me.FpSpread1.TextTipPolicy = FarPoint.Win.Spread.TextTipPolicy.Floating End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'ボタン不可設定 sender.Enabled = False 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 9999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 '第1カラムはボタン(ButtonCellType) Dim buttonCell As New FarPoint.Win.Spread.CellType.ButtonCellType buttonCell.Text = i.ToString("0000") 'ボタンのキャプション .Cells(i, 0).CellType = buttonCell '第2カラムはテキスト(TextCellType) Dim textCell As New FarPoint.Win.Spread.CellType.TextCellType .Cells(i, 1).CellType = textCell .Cells(i, 1).Text = "Test" & i.ToString("0000") 'Tagにチップテキストの設定 .Cells(i, 1).Tag = "ZZZZZZZZZZZZZZZZZ" & i.ToString("0000") '第3カラムはチェックボックス(CheckBoxCellType) Dim chkCell As New FarPoint.Win.Spread.CellType.CheckBoxCellType .Cells(i, 2).CellType = chkCell .Cells(i, 2).HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center .Cells(i, 2).Value = CBool(i Mod 2 = 0) '値はValueに設定 Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) 'ボタン許可設定 sender.Enabled = True End Sub 'TextTipFetchイベント Private Sub FpSpread1_TextTipFetch(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.TextTipFetchEventArgs) Handles FpSpread1.TextTipFetch 'カラムフッタ、カラムヘッダ、行ヘッダは処理しない If e.ColumnFooter Or e.ColumnHeader Or e.RowHeader Then Exit Sub End If If Not e.FetchCellNote Then '2番目のカラム?? If e.Column = 1 Then 'Tagに退避してある文字列 Dim text As String = e.View.GetSheetView().GetTag(e.Row, e.Column) 'チップウィンドウとして表示 e.ShowTip = True 'ポップアップヒントのテキスト設定 e.TipText = text End If End If End Sub End Class
下図は、フォームが表示後「Button1」をクリックしてデータを表示させて、 マウスを5行目の2カラム目に持っていった時の表示です。
=====
2016/02/29:の時の情報
-
SPREADのアクティブシートへのデータを設定する場合は一般的にアクティブシートのセルへ直接行います。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を6に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。 行の追加した後で、6個のセルに対して別々の値を設定しています。
SPREADへの描画を早くする為に、行データを全て処理する前後で、「FpSpread1.SuspendLayout()」と 「FpSpread1.ResumeLayout(True)」を行います。これらではさまれた処理は描画がリアルタイムでは 反映されないので、描画が早くなります。
今回の例では10000行のデータを設定しています。 この処理の時間はだいたい14秒前後掛かりました。 (私のPCのOSはWindows7SP1で、CPUはCorei5の3.2GHzです)
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 6 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '時間計測用 Dim dt As DateTime = Now 'ボタン不可設定 sender.Enabled = False 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'SPREADの行クリア .RowCount = 0 '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 9999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 .SetText(i, 0, "C1-" & i.ToString("0000")) .SetText(i, 1, "C2-" & i.ToString("0000")) .SetText(i, 2, "C3-" & i.ToString("0000")) .SetText(i, 3, "C4-" & i.ToString("0000")) .SetText(i, 4, "C5-" & i.ToString("0000")) .SetText(i, 5, "C6-" & i.ToString("0000")) Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '経過時間の表示 MsgBox("経過時間 = " & (Now - dt).TotalSeconds & "秒") 'ボタン許可設定 sender.Enabled = True End Sub End Class
下図は、最初、フォームが表示後、「Button1」をクリックした結果が以下の図です。
(今回の移行で、画像が見つからなかったので、割愛します...)
データが10000件も描画することは稀なので、このままでもいいのですが、 14秒はさすがに掛かり過ぎなので、他の方法で行ってみます。
以下のソースは、SPREADのアクティブシートのデータモデルを取得し、 そのデータモデルを使ってデータを設定しています。 ソース的にはほとんど変わりが無いのですが、 アクティブシートへの直接セル設定のところをデータモデル経由に変更しています。
この方法で行うと、0.2秒以下で処理が終わります。14秒から0.2秒への劇的な速度アップが見られました。
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 6 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '時間計測用 Dim dt As DateTime = Now 'ボタン不可設定 sender.Enabled = False 'データモデルを取得する Dim datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel = _ CType(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel) 'SPREADの行クリア Me.FpSpread1.ActiveSheet.RowCount = 0 '描画を停止させる Me.FpSpread1.SuspendLayout() '10000行のデータの処理 For i As Integer = 0 To 9999 '行数を増やす Me.FpSpread1.ActiveSheet.RowCount += 1 'データモデルでのデータ設定 datamodel.SetValue(i, 0, "C1-" & i.ToString("0000")) datamodel.SetValue(i, 1, "C2-" & i.ToString("0000")) datamodel.SetValue(i, 2, "C3-" & i.ToString("0000")) datamodel.SetValue(i, 3, "C4-" & i.ToString("0000")) datamodel.SetValue(i, 4, "C5-" & i.ToString("0000")) datamodel.SetValue(i, 5, "C6-" & i.ToString("0000")) Next '描画を再開させる Me.FpSpread1.ResumeLayout(True) '経過時間の表示 MsgBox("経過時間 = " & (Now - dt).TotalSeconds & "秒") 'ボタン許可設定 sender.Enabled = True End Sub End Class
=====
2016/02/29:の時の情報
-
SPREADのアクティブシートのセルにボタンセルタイプ(ButtonCellType)を設定した時の、 クリック時イベントの処理についてです。
以下のソースは、フォームロード時にSPREADの初期化を行っています。 アクティブシートのカラム数を3に設定し、ヘッダ行数を0でクリア設定しています。
フォーム表示後、ボタンをクリックすると、 クリックイベント内で宣言された固定的なテストデータをSPREADに設定し表示させます。
データの1行分毎の処理で、「RowCount」プロパティを+1して行を追加します。
追加された行の1カラム目にはボタンセルタイプ(ButtonCellType)を設定します。 ボタンのキャプションの設定は、ButtonCellTypeの「Text」プロパティに設定します。
2カラム目はテキストセルタイプ(TextCellType)を設定します。 データを設定するには、セルの「Text」プロパティに設定します。 TextCellTypeは先頭ゼロが省かれることなく、5個目のデータの"0000005"がそのまま表示されます。
3カラム目はチェックボックスセルタイプ(CheckBoxCellType)を設定します。 CheckBoxCellTypeの場合、データのチェックの状態を設定するには「Value」プロパティに設定します。
ボタンクリック時のイベントとしては、SPREADコントロールの「ButtonClicked」に処理を記述します。 「ButtonClicked」は「ButtonCellType」だけではなく以下のセルタイプでイベントが発生します。
・ButtonCellType ・CheckBoxCellType ・HyperlinkCellType ・MultiOptionCellType
Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.FpSpread1.ActiveSheet 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub 'ボタンクリックでカラム連結処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '仮に4行分のデータ Dim ArrData(,) As String = { _ {"001", "Test001", "True"}, _ {"002", "Test002", "False"}, _ {"003", "Test003", "True"}, _ {"004", "Test004", "False"}, _ {"005", "0000005", "False"} _ } 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet 'データの行数分の処理 For i As Integer = 0 To ArrData.GetLength(0) - 1 '行数を増やす .RowCount += 1 '第1カラムはボタン(ButtonCellType) Dim buttonCell As New FarPoint.Win.Spread.CellType.ButtonCellType buttonCell.Text = ArrData(i, 0) 'ボタンのキャプション .Cells(i, 0).CellType = buttonCell '第2カラムはテキスト(TextCellType) Dim textCell As New FarPoint.Win.Spread.CellType.TextCellType .Cells(i, 1).CellType = textCell .Cells(i, 1).Text = ArrData(i, 1) '第3カラムはチェックボックス(CheckBoxCellType) Dim chkCell As New FarPoint.Win.Spread.CellType.CheckBoxCellType .Cells(i, 2).CellType = chkCell .Cells(i, 2).HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center .Cells(i, 2).Value = CBool(ArrData(i, 2)) '値はValueに設定 Next End With End Sub 'ボタンクリック時処理 Private Sub FpSpread1_ButtonClicked(ByVal sender As Object, _ ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) _ Handles FpSpread1.ButtonClicked Dim str As String = "" With Me.FpSpread1.ActiveSheet str &= "行(e.Row) = " & e.Row & vbCrLf str &= "列(e.Column) = " & e.Column & vbCrLf str &= "2カラム目 = " & .Cells(e.Row, 1).Text & vbCrLf str &= "3カラム目 = " & CBool(.Cells(e.Row, 2).Value).ToString & vbCrLf MsgBox(str) End With End Sub End Class
下図は、最初、フォームが表示後、「Button1」をクリックした結果が以下の図です。
1行目の「001」ボタンをクリックした結果が以下の図です。 (メッセージBOXの表示をForm1の上に移動して画面キャプチャしていますので実際の表示位置とは異なります)
「ButtonClicked」イベントの引数である「e」のプロパティ「Row」「Column」で クリック時の行、カラム位置が分かります。このプロパティを使ってセルの情報を取得します。
5行目のチェックボックスをクリックした結果が以下の図です。
「ButtonClicked」がチェックボックスにも対応していることが分かります。 この時の3カラム目の値を見ると、チェックボックスが変化した後のチェックの状態を返す様です。 この点は注意が必要だと思います。
もし、セル上に各種のセルタイプのものが存在する場合は、カラム位置かもしくは、 イベントを発生させたControlオブジェクト(「e」のプロパティ「EditingControl」)で処理を分ける必要があります。
=====
2016/02/29:の時の情報