指定したポインタ位置のセルインデックスを取得する方法(固定列/行上でのクリックにより-1が返されます)

文書番号 : 31188     文書種別 : 使用方法     最終更新日 : 2011/08/10
文書を印刷する
対象製品
SPREAD for Windows Forms 5.0J
詳細
FpSpreadクラスメンバであるGetCellFromPixelメソッド呼び出し、およびCellRangeクラス機能の併用によって実現することが出来ます。詳細については製品ヘルプを参照してください。

※ヘッダやグレイエリア、固定列(行)上など、指定した位置にセルがない場合は(-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

◎サンプルコード(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());
  }

なお、固定列(行)上などでのセルインデックスを取得したい場合は以下の方法によって対応します。(または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


◎サンプルコード(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;
  }
関連情報
キーワード
「セル位置の設定/取得」