指定したポインタ位置のセルインデックスを取得する方法(固定列/行上でのクリックにより-1が返されます)
対象製品
SPREAD for Windows Forms 7.0J
詳細
FpSpreadクラスメンバであるGetCellFromPixelメソッド呼び出し、およびCellRangeクラス機能の併用によって実現することが出来ます。詳細については製品ヘルプを参照してください。
◎サンプルコード(VB)
◎サンプルコード(C#)
なお、固定列(行)上などでのセルインデックスを取得したい場合は以下の方法によって対応します。(またはCellClickイベントの実装による引数eからの参照)
◎サンプルコード(VB)
◎サンプルコード(C#)
※ヘッダやグレイエリア、固定列(行)上など、指定した位置にセルがない場合は(-1,-1)を返します
◎サンプルコード(VB)
Private Sub FpSpread1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseDown
Dim r As FarPoint.Win.Spread.Model.CellRange
r = FpSpread1.GetCellFromPixel(0, 0, e.X, e.Y)
Debug.WriteLine("行インデックス:" + r.Row.ToString)
Debug.WriteLine("列インデックス:" + r.Column.ToString)
End Sub
Dim r As FarPoint.Win.Spread.Model.CellRange
r = FpSpread1.GetCellFromPixel(0, 0, e.X, e.Y)
Debug.WriteLine("行インデックス:" + r.Row.ToString)
Debug.WriteLine("列インデックス:" + r.Column.ToString)
End Sub
◎サンプルコード(C#)
private void fpSpread1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
FarPoint.Win.Spread.Model.CellRange r;
r = fpSpread1.GetCellFromPixel(0, 0, e.X, e.Y);
Console.WriteLine("行インデックス:" + r.Row.ToString());
Console.WriteLine("列インデックス:" + r.Column.ToString());
}
{
FarPoint.Win.Spread.Model.CellRange r;
r = fpSpread1.GetCellFromPixel(0, 0, e.X, e.Y);
Console.WriteLine("行インデックス:" + r.Row.ToString());
Console.WriteLine("列インデックス:" + r.Column.ToString());
}
なお、固定列(行)上などでのセルインデックスを取得したい場合は以下の方法によって対応します。(またはCellClickイベントの実装による引数eからの参照)
◎サンプルコード(VB)
Imports FarPoint.Win.Spread
Imports FarPoint.Win.Spread.Model
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'固定情報の定義
FpSpread1.ActiveSheet.FrozenRowCount = 2
FpSpread1.ActiveSheet.FrozenColumnCount = 2
End Sub
Private Sub FpSpread1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseDown
'ポインタ位置のセルインデックスを取得
Dim cr As CellRange = FpSpread1.GetCellFromPixel(0, 0, e.X, e.Y)
If (cr.Row = -1 Or cr.Column = -1) Then
'指定した位置にセルがない場合は独自の取得方法
cr = GetCellFromXY(FpSpread1.ActiveSheet, e)
End If
Debug.WriteLine(cr.Row.ToString() + ", " + cr.Column.ToString())
End Sub
Private Function GetCellFromXY(ByVal sheet As SheetView, ByVal e As MouseEventArgs) As CellRange
Dim cr As CellRange = New CellRange(GetRowIndexFromY(sheet, e.Y), GetColumnIndexFromX(sheet, e.X), 1, 1)
Return cr
End Function
Private Function GetRowIndexFromY(ByVal sheet As SheetView, ByVal y As Integer) As Integer
'Y座標の算出
Dim iheight As Integer = 0
For i As Integer = 0 To sheet.ColumnHeader.RowCount - 1
iheight += Convert.ToInt32(sheet.ColumnHeader.Rows(i).Height)
If (y < iheight) Then
Return -1
End If
Next
For j As Integer = 0 To sheet.RowCount - 1
iheight += Convert.ToInt32(sheet.Rows(j).Height)
If (y < iheight) Then
Return j
End If
Next
Return -1
End Function
Private Function GetColumnIndexFromX(ByVal sheet As SheetView, ByVal x As Integer) As Integer
'X座標の算出
Dim iwidth As Integer = 0
For i As Integer = 0 To sheet.RowHeader.ColumnCount - 1
iwidth += Convert.ToInt32(sheet.RowHeader.Columns(i).Width)
If (x < iwidth) Then
Return -1
End If
Next
For j As Integer = 0 To sheet.ColumnCount - 1
iwidth += Convert.ToInt32(sheet.Columns(j).Width)
If (x < iwidth) Then
Return j
End If
Next
Return -1
End Function
Imports FarPoint.Win.Spread.Model
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'固定情報の定義
FpSpread1.ActiveSheet.FrozenRowCount = 2
FpSpread1.ActiveSheet.FrozenColumnCount = 2
End Sub
Private Sub FpSpread1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseDown
'ポインタ位置のセルインデックスを取得
Dim cr As CellRange = FpSpread1.GetCellFromPixel(0, 0, e.X, e.Y)
If (cr.Row = -1 Or cr.Column = -1) Then
'指定した位置にセルがない場合は独自の取得方法
cr = GetCellFromXY(FpSpread1.ActiveSheet, e)
End If
Debug.WriteLine(cr.Row.ToString() + ", " + cr.Column.ToString())
End Sub
Private Function GetCellFromXY(ByVal sheet As SheetView, ByVal e As MouseEventArgs) As CellRange
Dim cr As CellRange = New CellRange(GetRowIndexFromY(sheet, e.Y), GetColumnIndexFromX(sheet, e.X), 1, 1)
Return cr
End Function
Private Function GetRowIndexFromY(ByVal sheet As SheetView, ByVal y As Integer) As Integer
'Y座標の算出
Dim iheight As Integer = 0
For i As Integer = 0 To sheet.ColumnHeader.RowCount - 1
iheight += Convert.ToInt32(sheet.ColumnHeader.Rows(i).Height)
If (y < iheight) Then
Return -1
End If
Next
For j As Integer = 0 To sheet.RowCount - 1
iheight += Convert.ToInt32(sheet.Rows(j).Height)
If (y < iheight) Then
Return j
End If
Next
Return -1
End Function
Private Function GetColumnIndexFromX(ByVal sheet As SheetView, ByVal x As Integer) As Integer
'X座標の算出
Dim iwidth As Integer = 0
For i As Integer = 0 To sheet.RowHeader.ColumnCount - 1
iwidth += Convert.ToInt32(sheet.RowHeader.Columns(i).Width)
If (x < iwidth) Then
Return -1
End If
Next
For j As Integer = 0 To sheet.ColumnCount - 1
iwidth += Convert.ToInt32(sheet.Columns(j).Width)
If (x < iwidth) Then
Return j
End If
Next
Return -1
End Function
◎サンプルコード(C#)
using FarPoint.Win.Spread;
using FarPoint.Win.Spread.Model;
private void Form1_Load(object sender, System.EventArgs e)
{
//固定情報の定義
fpSpread1.ActiveSheet.FrozenRowCount = 2;
fpSpread1.ActiveSheet.FrozenColumnCount = 2;
}
private void fpSpread1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//ポインタ位置のセルインデックスを取得
CellRange cr = fpSpread1.GetCellFromPixel(0, 0, e.X, e.Y);
if (cr.Row == -1 || cr.Column == -1)
{
//指定した位置にセルがない場合は独自の取得方法
cr = GetCellFromXY(fpSpread1.ActiveSheet, e);
}
Console.WriteLine(cr.Row.ToString() + ", " + cr.Column.ToString());
}
private CellRange GetCellFromXY(SheetView sheet, MouseEventArgs e)
{
CellRange cr = new CellRange(GetRowIndexFromY(sheet, e.Y), GetColumnIndexFromX(sheet, e.X), 1, 1);
return cr;
}
private int GetRowIndexFromY(SheetView sheet, int y)
{
//Y座標の算出
int iheight = 0;
for (int i=0; i < sheet.ColumnHeader.RowCount;i++)
{
iheight += (int)sheet.ColumnHeader.Rows[i].Height;
if (y < iheight) return -1;
}
for (int i=0; i < sheet.RowCount;i++)
{
iheight += (int)sheet.Rows[i].Height;
if (y < iheight) return i;
}
return -1;
}
private int GetColumnIndexFromX(SheetView sheet, int x)
{
//X座標の算出
int iwidth = 0;
for (int i=0; i < sheet.RowHeader.ColumnCount; i++)
{
iwidth += (int)sheet.RowHeader.Columns[i].Width;
if (x < iwidth) return -1;
}
for (int i=0; i < sheet.ColumnCount;i++)
{
iwidth += (int)sheet.Columns[i].Width;
if (x < iwidth) return i;
}
return -1;
}
using FarPoint.Win.Spread.Model;
private void Form1_Load(object sender, System.EventArgs e)
{
//固定情報の定義
fpSpread1.ActiveSheet.FrozenRowCount = 2;
fpSpread1.ActiveSheet.FrozenColumnCount = 2;
}
private void fpSpread1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//ポインタ位置のセルインデックスを取得
CellRange cr = fpSpread1.GetCellFromPixel(0, 0, e.X, e.Y);
if (cr.Row == -1 || cr.Column == -1)
{
//指定した位置にセルがない場合は独自の取得方法
cr = GetCellFromXY(fpSpread1.ActiveSheet, e);
}
Console.WriteLine(cr.Row.ToString() + ", " + cr.Column.ToString());
}
private CellRange GetCellFromXY(SheetView sheet, MouseEventArgs e)
{
CellRange cr = new CellRange(GetRowIndexFromY(sheet, e.Y), GetColumnIndexFromX(sheet, e.X), 1, 1);
return cr;
}
private int GetRowIndexFromY(SheetView sheet, int y)
{
//Y座標の算出
int iheight = 0;
for (int i=0; i < sheet.ColumnHeader.RowCount;i++)
{
iheight += (int)sheet.ColumnHeader.Rows[i].Height;
if (y < iheight) return -1;
}
for (int i=0; i < sheet.RowCount;i++)
{
iheight += (int)sheet.Rows[i].Height;
if (y < iheight) return i;
}
return -1;
}
private int GetColumnIndexFromX(SheetView sheet, int x)
{
//X座標の算出
int iwidth = 0;
for (int i=0; i < sheet.RowHeader.ColumnCount; i++)
{
iwidth += (int)sheet.RowHeader.Columns[i].Width;
if (x < iwidth) return -1;
}
for (int i=0; i < sheet.ColumnCount;i++)
{
iwidth += (int)sheet.Columns[i].Width;
if (x < iwidth) return i;
}
return -1;
}
関連情報
- 【セル型全般】 複数行/列が定義されているヘッダにて、クリックされたヘッダセルの行/列インデックスを取得することは出来ますか?
- 【Tips】シート左上および右下のセルの行(列)インデックスを取得する
- 【Tips】指定した行(列)を先頭に表示させる
- 【Tips】任意のセルをスクロールして表示する方法
- 【Tips】セルが画面上に表示されているかどうかを取得する方法
キーワード
「セル位置の設定/取得」