データのドラッグ処理 2
ドロップ側の処理-DragEnterイベント
今度は、ドロップ側の処理を作成します。まずは、下側のfpSpreadコンポーネントに、ドラッグ&ドロップ操作の効果を設定します。ドロップでデータを受け取る側ですから、DragEnterイベントハンドラで処理をします。
GetDataPresent
メソッドで、ドロップするデータがあるかどうかを判断し、データがあればイベントハンドラの引数eのEffectプロパティに「DragDropEffects.Move」を設定します。
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
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
メソッドで解除します。
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
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オブジェクトとして取得できました。
p = FpSpread2.PointToClient(New Point(e.X, e.Y))
range = FpSpread2.GetCellFromPixel(0, 0, p.X, p.Y)
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
メソッドを使用し、ドロップするセル範囲を選択範囲として追加します。これで、ドロップ処理が完成します。
この処理のコード全文は次のようになります。
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
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コントロールのような使い方でデータの処理に利用できます。
紹介したように、ドラッグ&ドロップ機能もサポートしており、特定の業務処理に特化したアプリケーションを作成するときなどに威力を発揮するのではないでしょうか。