同じグリッドビューで特定の位置から別の位置に行をドラッグしたいと思います。他の行はドラッグアンドドロップに従って自動的に調整されます。 データグリッドのドラッグアンドドロップ行Winformの表示C#
は答えて
私は多くのアプリケーション内でD & Dを実行するとき、このため、実際のドラッグ&ドロップイベントの上にマウスイベントを使用して好むありがとうございました。
1 - ここでは結合していない例
はLabel
の一方Cell
値をdiplayingながら周りの行をドラッグし、マウスイベントを使用する簡単な例です。
行をドロップした後に行を挿入します。私たちはクラスレベルで2つのヘルパー変数を宣言
まず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;
}
- 1. vbscriptのDLLからWinForm(C#)を表示
- 2. C#WinFormを別の画面に表示
- 3. C#.net Winform - 複数形式の表示と非表示
- 4. C#Winformパネル表示されたイベント
- 5. httpClientがエラーを表示するC#winform
- 6. 別のフォームからForm1データグリッドをリフレッシュするC#winform
- 7. winformが表示された後にイベントを実行するC#
- 8. Winformの表示のバグ
- 9. データグリッド表示のアクセス要素
- 10. C#asp.netデータグリッド編集時のみ表示日付
- 11. datagrid列の値が表示されないC#winform
- 12. XMLデータをデータグリッドに表示
- 13. データグリッド表示でkeypressイベント?
- 14. データグリッド内のオブジェクトのリストを表示
- 15. C#のデータグリッドの行数と列数
- 16. ユニットテスト中にwinformを表示
- 17. WinformアプリケーションでのSilverlightオブジェクトの表示
- 18. Silverlightデータグリッドをドラッグして現在の行をハイライト表示
- 19. データグリッドに交互に行の色を表示する
- 20. データグリッドのクロスタブc#
- 21. WPFデータグリッドでsp_who2の出力を表示
- 22. データグリッドdoesntの表示は何も(WCF-RIA)
- 23. jQueryドラッグアンドドロップ複数のGridview行をチェックボックスで表示
- 24. C#WPF - データグリッドの代替空白行
- 25. ボタンWinFormのタブページで非表示
- 26. C#WinFormのDataGridView
- 27. カスタムコントロールのドラッグアンドドロップC#
- 28. datacontext wpfからすべてのデータグリッド列を表示/非表示
- 29. jQueryデータグリッドでの表示/非表示問題
- 30. 2つのフォームをwinformで非表示/表示
これまでに何を試みましたか? Stack Overflowはコードが書かれた場所ではないことを忘れないでください! [読んでください](http://stackoverflow.com/help/how-to-ask)。 –
dragdropイベントを試しましたが、私のために働いていません – Ravi
あなたが試したことを示すコードを投稿してください。それは、あなたを助けようとしている人々の生活を容易にします。 –