2016-07-14 9 views
2

OnMouseDown/Moveを使用してドラッグを開始するグリッド行のドラッグアンドドロップを実装するには、サブクラス化したをドラッグを開始します。それはうまく動作しますが、私が直面している問題は、ユーザーがもはや行のサイズを変更できなくなることです。 OnMouseDownでポインタが "サイズ変更行"のホットゾーンにあるので、ドラッグアンドドロップをスキップできるようにする方法はありますか?MouseDownが行サイズ変更範囲を超えているかどうかを検出する方法

HitTestInfo.Typeは、行ヘッダーと行分離記号を区別しないことに注意してください。内部フィールド(typeInternal)がありますが、アクセスできません。以下は

は、関連するコードスニペットです:

var hitTest = grid.HitTest(e.X, e.Y); 
int dragRowIndex = hitTest.RowIndex; 
if (hitTest.Type == DataGridViewHitTestType.RowHeader && dragRowIndex != -1) 
{ 
    //Start dragging 
} 
+0

私はポストを編集し、難しい質問を読んで作った不要なコードを削除し、ちょうど最も重要な部分を保持ポストを将来の読者にとってより有用にするためのコードです。 OPによって投稿された残りのコードに興味がある人は、[revisions](http://stackoverflow.com/posts/38384611/revisions)で元の投稿を見つけることができます。 –

答えて

2

あなたがHitTestメソッドを使用してDataGridViewのヒットテストを実行し、結果HitTestInfoがヒットテストの結果についての追加情報が含まれていtypeInternalという内部フィールドが含まれていますあなたが必要です。フィールドの型は内部列挙型です。あなたの内部フィールドの値を取得し、期待値を含むenumには、この方法でそれを唱えるための使用Reflection

private enum DataGridViewHitTestTypeInternal 
{ 
    None, 
    Cell, 
    ColumnHeader, 
    RowHeader, 
    ColumnResizeLeft, 
    ColumnResizeRight, 
    RowResizeTop, 
    RowResizeBottom, 
    FirstColumnHeaderLeft, 
    TopLeftHeader, 
    TopLeftHeaderResizeLeft, 
    TopLeftHeaderResizeRight, 
    TopLeftHeaderResizeTop, 
    TopLeftHeaderResizeBottom, 
    ColumnHeadersResizeBottom, 
    ColumnHeadersResizeTop, 
    RowHeadersResizeRight, 
    RowHeadersResizeLeft, 
    ColumnHeaderLeft, 
    ColumnHeaderRight 
} 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    var info = this.HitTest(e.X, e.Y); 
    var typeInternal = info.GetType().GetField("typeInternal", 
      System.Reflection.BindingFlags.NonPublic | 
      System.Reflection.BindingFlags.Instance); 

    var value = (DataGridViewHitTestTypeInternal)typeInternal.GetValue(info); 
    /* Then decide based on value */ 
    // Rest of logic 
    base.OnMouseDown(e);  
} 
+0

答えについての質問がある場合は教えてください:) –

+0

あなたの答えは完全にクリアです(おそらく唯一の解決策です)。私はReflectionを避けることを望んでいました。スピードの理由だけではなく、コードが壊れる可能性があります(フィールドは将来のバージョンでは存在しないかもしれません。enumは変更されるかもしれません)。 –

+1

それを心配しないでください。確かにそれはパフォーマンスの問題がありません。それは完全にOKです。変更点については、将来のリリースで変更されることはないと信じていますが、見つかったかどうかを確認するためにヌルチェックを追加するだけです:) –

関連する問題