2016-07-14 55 views
2

我已將子類型DataGridView用於實現使用OnMouseDown/Move拖動網格行以開始拖動。它運行良好,但我面臨的問題是用戶不能再調整行的大小。有沒有辦法在OnMouseDown中檢測到指針位於「resize row」熱區中,以便我可以跳過開始拖放操作?請注意,HitTestInfo.Type不區分行標題和行分隔符。有一個內部字段(typeInternal),但無法訪問。如何檢測MouseDown是否結束行調整大小區域

下面是相關的代碼片段:

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內場,其中包含有關命中測試結果的附加信息你需要。該字段的類型是內部枚舉。您的使用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,而不僅僅是爲了速度的原因,但主要是因爲它可能會破壞我的代碼(該字段可能不存在於將來的版本或枚舉可能會改變) –

+1

不要擔心。當然它不會有性能問題。這完全沒問題。另外關於變化,我相信它在將來的版本中不會改變,但是你可以簡單地添加一個空字段檢查來檢查它是否被發現:) –