2009-05-13 18 views
1

.NET 2008 winformsで作業しています。DataGridViewから別のコントロールにオブジェクトをドラッグアンドドロップしようとしています。そこで、OnMouseDownイベントハンドラをオーバーライドする必要がありました。そこにチェックボックスがあるので、状態は決して変更されません。ここに私のオーバーライドされたメソッドDataGridViewのOnMouseDownをオーバーライドすると、親メソッドを呼び出すときにもチェックボックスが無効になります。

public class SeriesGrid : DataGridView 
{ 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     DataGridViewSelectedRowCollection selectedRows = this.SelectedRows; 
     if (selectedRows.Count == 0) return; 

     List<AppDataSeries> toDrag = new List<AppDataSeries>(); 
     for (int i = 0; i < selectedRows.Count; i++) 
     { 
      toDrag.Add((AppDataSeries)selectedRows[i].DataBoundItem); 
     } 
     this.DoDragDrop(toDrag, DragDropEffects.Copy); 

    } 

} 

DoDragDrop関数が問題を引き起こしているように見えるのです、私はそれを削除する場合は、チェックボックスが正常に動作するので、しかし、私は何が他の制御

で任意のヘルプを落とすために得ることはありませんか?

+0

(クリックでいくつかのUIの不具合を避けるためにcancelDragを含めるように編集しましたか)? –

+0

ほとんどのセルはチェックボックスです – mustafabar

+0

DataGridViewCheckBoxCell – mustafabar

答えて

2

OK、これはハッキーですが、機能します。それは可能、ドラッグに小さな遅延を挿入し、チェック/正常に動作するようにオフ:

正確にチェックボックスがある

volatile bool cancelDrag; 
protected override void OnMouseUp(MouseEventArgs e) 
{ 
    cancelDrag = true; 
    base.OnMouseUp(e); 
} 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    base.OnMouseDown(e); 
    cancelDrag = false; 
    ThreadPool.QueueUserWorkItem(delegate 
    { 
     Thread.Sleep(250); 
     if (!cancelDrag) 
     { 
      BeginInvoke((MethodInvoker)delegate 
      { 
       if (!cancelDrag) 
       { 
        // your code here... 
        var sel = this.SelectedRows; 
        if (sel.Count > 0) 
        { 
         this.DoDragDrop("test", DragDropEffects.All); 
        } 
       } 
      }); 
     } 
    }); 
} 
+0

Marc ..ありがとうございます。私はあなたの助けに感謝します – mustafabar

+0

問題はありません。とstackoverflowへようこそ; - P –

0

メソッドの最後にbase.OnMouseDown(e);を呼び出してください。

+0

私はそれを試しました。どちらもうまくいかない! – mustafabar

関連する問題