CodeZine(コードジン)

特集ページ一覧

グリッドデータをドラッグ&ドロップで操作し新しい表を作成する.NETアプリケーションを作る

「PowerTools ComponentOne Studio 2012J」のC1TrueDBGridコントロールを使った.NETアプリケーションの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/12/27 14:00
目次

ドラッグ側の処理

 ドラッグ側のC1TrueDBGridコントロールでは、まずMouseDownイベントハンドラでドラッグがどの行のデータの上で行われたのかを、マウスポインタの座標で把握します。そして、MouseMoveイベントハンドラでドラッグの操作を開始します。Clickイベントハンドラではマウスポインタの座標が把握できませんので、これらのイベントハンドラを利用しています。

 (1)MouseDownイベントハンドラでは、C1TrueDBGridクラスのCellContainingメソッドで、マウスボタンが押された時のC1TrueDBGridコントロール上のマウスポインタの座標とグリッドの行列番号を引数の変数に格納します。

 e.X, e.Yはドラッグ操作の開始点として使用し、rowはその位置の行番号として使用します。

Visual Basic
Private StartDrag_PT As Point
Private DragRowNo As Integer

Private Sub C1TrueDBGrid1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles C1TrueDBGrid1.MouseDown
    Dim row, col As Integer
    StartDrag_PT = Point.Empty
    DragRowNo = -1
    If C1TrueDBGrid1.CellContaining(e.X, e.Y, row, col) Then
        ' ドラッグ操作の開始点を保存します。
        StartDrag_PT = New Point(e.X, e.Y)
        DragRowNo = row
    End If
End Sub
C#
private Point StartDrag_PT;
private int DragRowNo;

private void c1TrueDBGrid1_MouseDown(object sender, MouseEventArgs e)
{
    int row, col;
    StartDrag_PT = Point.Empty;
    DragRowNo = -1;
    if(c1TrueDBGrid1.CellContaining(e.X, e.Y, out row, out col)) 
    {
        // ドラッグ操作の開始点を保存します。
        StartDrag_PT = new Point(e.X, e.Y);
        DragRowNo = row;
    }
}

 (2)マウスポインタが動いたらドラッグが開始したと判断し、ドラッグの処理を開始します。

 まず、マウスポインタの座標の変化でドラッグが開始したかどうかを判断します。これは、マウスポインタのある座標位置を起点にした矩形を作成し、この座標の変化で判断します。

 そして、MarqueeStyleプロパティで行全体を反転表示に切り替え、DoDragDroメソッドを実行します。

 このメソッドは、指定された行に対し指定した「DragDropEffect」列挙体のメンバ「コピー」に従ってドラッグ&ドロップ操作を開始します。

Visual Basic
Private Sub C1TrueDBGrid1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles C1TrueDBGrid1.MouseMove

    'ドラッグの開始点が空でない場合はラッグが開始されていると判断
    If Not StartDrag_PT.IsEmpty Then

        'ドラッグ操作の開始点を囲む四角形を 2 ピクセルで作成
        Dim rect As New Rectangle(StartDrag_PT, Drawing.Size.Empty)
        rect.Inflate(2, 2)

        '3ピクセル以上移動している場合はドラッグ操作を開始
        If Not rect.Contains(e.X, e.Y) Then
            C1TrueDBGrid1.Row = DragRowNo
            C1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.HighlightRow
            C1TrueDBGrid1.DoDragDrop(DragRowNo, DragDropEffects.Copy)
        End If
    End If
End Sub
C#
private void c1TrueDBGrid1_MouseMove(object sender, MouseEventArgs e)
{
            
    //ドラッグの開始点が空でない場合はラッグが開始されていると判断
    if (!StartDrag_PT.IsEmpty)
    {
        //ドラッグ操作の開始点を囲む四角形を 2 ピクセルで作成
        Rectangle rect = new Rectangle(StartDrag_PT, Size.Empty);
        rect.Inflate(2, 2);

        // 3ピクセル以上移動している場合はドラッグ操作を開始
        if (!rect.Contains(e.X, e.Y))
        {
            c1TrueDBGrid1.Row = DragRowNo;
            c1TrueDBGrid1.MarqueeStyle = C1.Win.C1TrueDBGrid.MarqueeEnum.HighlightRow;
            c1TrueDBGrid1.DoDragDrop(DragRowNo, DragDropEffects.Copy);
        }
    }
}
「DragDropEffect」列挙体のメンバ
メンバ名 説明
None アクションなし。
Move ドラッグ元要素をドラッグ先要素に移動します。
Copy ドラッグ元要素をドラッグ先要素にコピーします。

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

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

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

バックナンバー

連載:ComponentZine(ComponentOne Studio)

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5