2016-07-01 117 views
0

我遇到了一個問題,在基於數據表值的DataGridView(DGV)中以編程方式進行多選擇。我有一個帶有「ID」列的表格,我需要將這些值傳遞給另一個帶DGV的表單進行編輯,ID也是第一個DGV列,即對於表格中的每個ID,都應該選擇適當的DGV行。 我可以遍歷表格和DGV,但只有最後一個值被選中,即使DGV屬性MultiSelect = true ...當我手動使用表格時,多個選擇都可以正常工作。C#DataGridView多選擇被覆蓋

foreach(DataRow dtrow in dt.Rows) 
    { 
     string Selection = dtrow["ID"].ToString(); 
     foreach(DataGridViewRow DGVrow in dgview.Rows) 
     {      
      if (DGVrow.Cells[0].Value.ToString().Equals(Selection)) 
      { 
       dgview.CurrentCell = DGVrow.Cells[0]; 
       int cellInx = dgview.CurrentCell.RowIndex; 
       dgview.Rows[cellInx].Selected = true;                      
       break; 
      } 
     } 
    } 
+0

不應該你的選擇變量使用dtRow變量?你沒有在循環中的任何地方使用dtRow變量。 – LarsTech

+0

對不起,這是一個錯字...我更新了代碼。 – ArtR45

回答

0

我回答我自己的問題,因爲我不認爲這是可能的表單加載。我的應用程序有一個用於向項目添加選擇的表單。當用戶想要「編輯」項目時,我需要調用此表單並完成所有以前的選擇,以便用戶可以添加/刪除。 在啓用多選功能的情況下使用DataGridView(DGV)時,在運行時,您可以'ctl-click'並選擇多個項目......實質上,我試圖在'編輯'窗體加載代碼中重新創建此行爲'模式。 後的形式被初始化我有一個從OleDb的表加載DGV的方法,測試了這一點我試圖把下面的線負載方法調用後和方法調用的最後幾行:

 dgv1.Rows[0].Selected = true; 
     dgv1.Rows[1].Selected = true; 
     dgv1.Rows[2].Selected = true; 

顯然,在表格加載時,我期待前3行被選中,但這並沒有發生。 但是,我記得一個單獨的問題,如果沒有默認選擇的第一行,我永遠無法加載DGV ...所以我放入一個'刷新'按鈕,只需再次調用'Load'方法...最後一行是:DGV1.Rows[0].Selected = False;使用刷新按鈕,DGV在未選擇第一行的情況下加載。 我很好奇,如果這是一個類似的情況,所以當我將這3行添加到加載方法的末尾時,表單加載上沒有任何事情發生......但是當我點擊'刷新'按鈕時,前3行被「選中」。

我一直在研究這個超過3天,發現從DataGridView的項目經理(2006年)如下: https://social.msdn.microsoft.com/Forums/windows/en-US/cf351d44-4a9a-4c80-8d52-4fb349847908/multiple-select-is-not-working-for-datagridview?forum=winformsdatacontrols

不幸的是,不是一件容易的解決這個,因爲我沒有看看這個場景並設計網格來處理這個問題。主要的問題源於這樣一個事實,即當您在網格上向下滑動時,網格會在選擇下一個單元格/行/列之前設置當前單元格屬性,以清除選擇內容。所以,當你的代碼行選擇行時,當你去選擇下一行或者使用鍵盤移動到下一行時,你選擇的行被清除。最簡單的方法是通過RowPrePaint使用自定義繪畫,並使用相同的SelectedBackground顏色繪製「選定」行。您可以查詢您正在繪製的行中複選框單元格的值,以確定該行是否「已選中」,但是沒有必要將Selected屬性設置爲true。另一方面,您必須跟蹤或枚舉所有行,以在給定時間知道所有「選定」行。 - > mark - > DataGridView程序管理器 - 2006

所以我的計劃是按照建議重建DGV以使用複選框。我只是想把它放在那裏作爲一般信息和/或如果有人有一個更好的主意。謝謝