2017-05-10 12 views
0

同じグリッドビューで特定の位置から別の位置に行をドラッグしたいと思います。他の行はドラッグアンドドロップに従って自動的に調整されます。 データグリッドのドラッグアンドドロップ行Winformの表示C#

+2

これまでに何を試みましたか? Stack Overflowはコードが書かれた場所ではないことを忘れないでください! [読んでください](http://stackoverflow.com/help/how-to-ask)。 –

+0

dragdropイベントを試しましたが、私のために働いていません – Ravi

+2

あなたが試したことを示すコードを投稿してください。それは、あなたを助けようとしている人々の生活を容易にします。 –

答えて

6

私は多くのアプリケーション内でD & Dを実行するとき、このため、実際のドラッグ&ドロップイベントの上にマウスイベントを使用して好むありがとうございました。

1 - ここでは結合していない例

Labelの一方Cell値をdiplayingながら周りの行をドラッグし、マウスイベントを使用する簡単な例です。

行をドロップした後に行を挿入します。私たちはクラスレベルで2つのヘルパー変数を宣言

enter image description here

まずdragLabel部分はオプションです

は..:

int dragRow = -1; 
Label dragLabel = null; 

はその後、我々はLabelを準備するためにCellMouseDownをコーディング..:

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.ColumnIndex<0 || e.RowIndex < 0) return; 
    dragRow = e.RowIndex; 
    if (dragLabel == null) dragLabel = new Label(); 
    dragLabel.Text = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(); 
    dragLabel.Parent = dataGridView1; 
    dragLabel.Location = e.Location; 
} 

MouseMoveでは、ラベルを移動するだけです。しかしMouseDownとして通常実際の作業はMouseUpである

private void dataGridView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left && dragLabel != null) 
    { 
     dragLabel.Location = e.Location; 
     dataGridView1.ClearSelection(); 
    } 
} 

..私たちは選択を解除し、セルの選択を開始します。私たちがいる行があれば、それを見つけるにはHitTestが必要です。また、ドラッグの方向に応じてターゲット行を計算する必要があります。

最後に、我々はいくつかの注意事項

private void dataGridView1_MouseUp(object sender, MouseEventArgs e) 
{ 
    var hit = dataGridView1.HitTest(e.X,e.Y); 
    int dropRow = -1; 
    if (hit.Type != DataGridViewHitTestType.None) 
    { 
     dropRow = hit.RowIndex; 
     if (dragRow >= 0) 
     { 
      int tgtRow = dropRow + (dragRow > dropRow ? 1 : 0); 
      if (tgtRow != dragRow) 
      { 
       DataGridViewRow row = dataGridView2.Rows[dragRow]; 
       dataGridView2.Rows.Remove(row); 
       dataGridView2.Rows.Insert(tgtRow, row); 

       dataGridView2.ClearSelection(); 
       row.Selected = true; 
      } 
     } 
    } 
    else { dataGridView2.Rows[dragRow].Selected = true;} 

    if (dragLabel != null) 
    { 
     dragLabel.Dispose(); 
     dragLabel = null; 
    } 
} 

... Labelをクリーンアップ:

何行は、新規または変更されていないか、あなたはそれを移動することはできませんことを確認してください。最初に行を追加する前にAllowUserToAddRowsをオフにしなければならないことに気付くのがしばらくかかりました。

選択の扱いはあなた次第です。ドロップが失敗した場合、ドラッグされた行を選択することにしました。私は空の空間にドラッグすると失敗するようにしました。

更新:

2 - データバインドの例

DGVがある場合データバインドあなたが直接行を移動することはできません。代わりに、DataSourceの行を移動する必要があります。

DataTable DTがあるとします。その後、行を削除して、任意の位置に行を挿入することができます。 (SQL DBMSテーブルとはまったく異なります!)

DataRowは、DataTableから削除された値を失います。したがって、行を削除する前に値をクローンする必要があります。それ以外のコードはほとんど同じです。最も内側の条件を次のように置き換えてください:

if (tgtRow != dragRow) 
{ 
    DataRow dtRow = DT.Rows[dragRow]; 
    DataRow newRow = DT.NewRow(); 
    newRow.ItemArray = DT.Rows[dragRow].ItemArray; // we need to clone the values 

    DT.Rows.Remove(dtRow); 
    DT.Rows.InsertAt(newRow, tgtRow); 
    dataGridView1.Refresh(); 
    dataGridView1.Rows[tgtRow].Selected = true; 
} 
+0

このエラーを取得する "コントロールがデータバインドされている場合、DataGridViewの行コレクションに行をプログラムで追加することはできません。 – Ravi

+0

ああ、そうです。あなたはその質問に言及すべきでした。私はちょっと答えを修正します。 – TaW

+0

あなたの答えを待っています。前もって感謝します。 – Ravi

関連する問題