2012-12-07 49 views
1

我有一個WinForms應用程序在幾個地方有datagrids。DataGrid上的右鍵總是返回RowIndex -1

在我設置了一個事件右鍵點擊如下DataGrid中的一個:

private void dataBundles_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    try 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      var cell = dataBundles.HitTest(e.X, e.Y); 
      int cellRow = cell.RowIndex; 
      DataTable table = (DataTable)dataBundles.DataSource; 
      string bundleID = table.Rows[cellRow]["BundleID"].ToString(); 
      dataBundles.Rows[cellRow].DefaultCellStyle.BackColor = Color.Red; 
      if (MessageBox.Show("Are you sure you want to delete Bundle ID '" + bundleID + "'?", 
           "Confirm Delete Bundle", MessageBoxButtons.YesNo) == DialogResult.Yes) 
      { 
       int intBundleID = Int32.Parse(bundleID); 
       cBundle bundle = new cBundle(intBundleID); 
       bundle.Delete(); 
       PopulateDocumentsTab();       
      } 
      else 
      { 
       dataBundles.Rows[cellRow].DefaultCellStyle.BackColor = Color.White; 
      } 
     } 
    } 
    catch (Exception eX) 
    { 
     string eM = "Error occurred when right clicking the Bundles datagrid"; 
     aError err = new aError(eX, eM); 
     MessageBox.Show(eX.Message, eM); 
    } 
} 

但是出於某種原因,不管我在哪裏用鼠標右鍵單擊該數據網格中,rowIndex位置總是返回 - 1這當然是'關閉'電網,因此導致錯誤。

我看不到我做了什麼錯了,因爲我已經使用其他DataGrid中右鍵單擊事件相同的代碼相同的應用程序中,他們都做工精細。

我敢肯定,無論我錯過什麼,它都會變得簡單,但我現在已經在這段代碼中主演了很長一段時間。

有人能讓我擺脫苦難嗎?

+0

我有同樣的問題一次,我沒有解決這個問題,但他發現,我通常會得到2調用我的回調函數。第一個是行索引= -1,第二個是有效的。我用一個簡單的If語句解決了它。你有沒有檢查是否收到多個電話? – Nitay

回答

1

最後發現問題。 。 。

我用的是「CellMouseDown」事件

一次我調到相同的代碼來了「的MouseDown」事件,而不是它的工作

+0

即將發佈此自己。我不知道爲什麼cellmousedown會像你所看到的那樣行事 - 但有一件事,你實際上並不需要cellmousedown處理程序中的命中 - 事件參數已經有了行索引。但無論如何,正如您發現的那樣,mousedown更穩定,並且可以像您一樣放置代碼。 –

0

只是一些添加代碼來避免這種錯誤

if (cellRow == -1) return 

這個錯誤的原因的,因爲你正在使用的HitTest(e.X, e.Y)用於dataTable的或DataGridView和你想在DataGridView點擊的地方,但不是在Cell,所以設備t他結果是

cellRow -1