SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(SPREAD)

2つのスプレッドシート間でデータをドラッグ&ドロップできる.NETアプリ

SPREAD for .NET 2.5J Windows Forms Editionコンポーネントの便利なテクニック

  • このエントリーをはてなブックマークに追加

データのドラッグ処理 2

ドロップ側の処理-DragEnterイベント

 今度は、ドロップ側の処理を作成します。まずは、下側のfpSpreadコンポーネントに、ドラッグ&ドロップ操作の効果を設定します。ドロップでデータを受け取る側ですから、DragEnterイベントハンドラで処理をします。

 GetDataPresentメソッドで、ドロップするデータがあるかどうかを判断し、データがあればイベントハンドラの引数eのEffectプロパティに「DragDropEffects.Move」を設定します。

Visual Basic
Private Sub FpSpread2_(ByVal sender As Object, _
         ByVal e As System.Windows.Forms.DragEventArgs) _
            Handles FpSpread2.DragEnter
    If e.Data.GetDataPresent(DataFormats.Text) Then
        e.Effect = DragDropEffects.Move
    End If
End Sub
C#.NET
private void fpSpread2_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Text))
    {
        e.Effect = DragDropEffects.Move;
    }
}

ドロップ側の処理-DragDropイベント

 次に、DragDropイベントハンドラでは、ドロップしたときの処理を実行します。

 まず、ドロップ先のセル範囲を、GetSelectionメソッドで取得します。というのも、ドラッグ&ドロップされてきたときは、ドラッグしてきたセル範囲がドロップ側のfpSpreadコンポーネントにも反映されるようになっています。そして、SetClipメソッドを使ってそのセル範囲に、変数msgに格納していたデータを設定します。

 また、ドラッグ元のfpSpreadコンポーネントのセル範囲を、RemoveSelectionメソッドで解除します。

Visual Basic
Private Sub FpSpread2_DragDrop(ByVal sender As Object, _
              ByVal e As System.Windows.Forms.DragEventArgs) _
                 Handles FpSpread2.DragDrop
    Dim sel As FarPoint.Win.Spread.Model.CellRange
    sel = FpSpread2.ActiveSheet.GetSelection(0)
    FpSpread2.ActiveSheet.SetClip(sel.Row, _
                sel.Column, sel.RowCount, sel.ColumnCount, msg)
    FpSpread1.ActiveSheet.RemoveSelection(SelectRange.Row, _
                                          SelectRange.Column, _
                                          SelectRange.RowCount, _
                                          SelectRange.ColumnCount)
End Sub
C#.NET
private void fpSpread2_DragDrop(object sender, DragEventArgs e)
{
    FarPoint.Win.Spread.Model.CellRange sel
      = fpSpread2.ActiveSheet.GetSelection(0);
    if (sel != null)
        fpSpread2.ActiveSheet.SetClip(sel.Row, 
                                      sel.Column, 
                                      sel.RowCount, 
                                      sel.ColumnCount, 
                                      msg);
     fpSpread1.ActiveSheet.RemoveSelection(selectrange.Row, 
                                           selectrange.Column, 
                                           selectrange.RowCount, 
                                           selectrange.ColumnCount);
}

ドロップ側の処理-DragOverイベント

 このアプリケーションでは、ドロップ先のスプレッドシートにデータを設定する処理を、このDragOverイベントハンドラで行います。

1.選択範囲の取得

 まず、ドロップする場所のマウスポインタの位置を把握します。これは、PointToClientメソッドを使用します。

 そして、その位置からセルの位置と選択範囲を取得します。これは、GetCellFromPixelメソッドを使用します。これで、ドロップ先のセル範囲をCellRangeオブジェクトとして取得できました。

Visual Basic
p = FpSpread2.PointToClient(New Point(e.X, e.Y))
range = FpSpread2.GetCellFromPixel(0, 0, p.X, p.Y)
C#.NET
Point p = fpSpread2.PointToClient(new Point(e.X, e.Y));
FarPoint.Win.Spread.Model.CellRange range
  = fpSpread2.GetCellFromPixel(0, 0, p.X, p.Y);

2.ドロップ

 次に、ドロップ側のfpSpreadコンポーネントに、現在選択されているセルがある場合は、一度これをRemoveSelectionメソッドで解除します。そして、ActiveSheetメソッドを使用し、ドロップするセル範囲を選択範囲として追加します。これで、ドロップ処理が完成します。

 この処理のコード全文は次のようになります。

Visual Basic
Private Sub FpSpread2_DragOver(ByVal sender As Object, _
             ByVal e As System.Windows.Forms.DragEventArgs) _
                 Handles FpSpread2.DragOver

    Dim rowcnt, colcnt As Integer
    Dim p As Point
    Dim range As FarPoint.Win.Spread.Model.CellRange
    Dim sel As FarPoint.Win.Spread.Model.CellRange

    rowcnt = SelectRange.RowCount
    colcnt = SelectRange.ColumnCount

    ' クライアント座標を算出します。
    p = FpSpread2.PointToClient(New Point(e.X, e.Y))

    ' 指定したポイントから CellRange オブジェクトを取得します。
    range = FpSpread2.GetCellFromPixel(0, 0, p.X, p.Y)

    ' 行数及び列数のあるときは
    If range.ColumnCount <> -1 And range.RowCount <> -1 Then
        ' 現在選択しているセル範囲のあるときは
        sel = FpSpread2.ActiveSheet.GetSelection(0)
        If Not (sel Is Nothing) Then
            ' 現在のセル範囲の選択状態を解除します。
            FpSpread2.ActiveSheet.RemoveSelection(sel.Row, _
                        sel.Column, sel.RowCount, sel.ColumnCount)
        End If
        ' 指定したセル範囲を選択範囲に追加します。
        FpSpread2.ActiveSheet.AddSelection(range.Row, _
                                       range.Column, rowcnt, colcnt)
    End If
End Sub
C#.NET
private void fpSpread2_DragOver(object sender, DragEventArgs e)
{
    int rowcnt = selectrange.RowCount;
    int colcnt = selectrange.ColumnCount;

    // クライアント座標を算出します。
    Point p = fpSpread2.PointToClient(new Point(e.X, e.Y));

    // 指定したポイントからCellRange オブジェクトを取得します。
    FarPoint.Win.Spread.Model.CellRange range
      = fpSpread2.GetCellFromPixel(0, 0, p.X, p.Y);

    // 行数及び列数の無いときは関数を抜けます。
    if (range.ColumnCount == -1 && range.RowCount == -1)
        return;

    // 現在選択しているセル範囲を取得します。
    FarPoint.Win.Spread.Model.CellRange sel
      = fpSpread2.ActiveSheet.GetSelection(0);

    if (sel != null)
        // 現在のセル範囲の選択状態を解除します。
        fpSpread2.ActiveSheet.RemoveSelection(sel.Row, 
                                              sel.Column, 
                                              sel.RowCount, 
                                              sel.ColumnCount);

        // 指定したセル範囲を選択範囲に追加します。
        fpSpread2.ActiveSheet.AddSelection(range.Row, 
                                           range.Column, 
                                           rowcnt, 
                                           colcnt);
        }

まとめ

 1つのアプリケーション内に2つのスプレッドシートコンポーネントを組み込んで、ドラッグ&ドロップでデータを処理するプログラムを作成してみました。こうすると、fpSpreadコンポーネントを表計算コンポーネントとして使用するのではなく、Gridコントロールのような使い方でデータの処理に利用できます。

 紹介したように、ドラッグ&ドロップ機能もサポートしており、特定の業務処理に特化したアプリケーションを作成するときなどに威力を発揮するのではないでしょうか。

 
修正履歴

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1568 2010/06/17 12:59

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング