SHOEISHA iD

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

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

ComponentZine(ComponentOne)

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

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

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

ドラッグ側の処理

 ドラッグ側の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 ドラッグ元要素をドラッグ先要素にコピーします。

次のページ
ドロップ側の処理

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6923 2012/12/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング