2013-12-20 53 views
0

我在我的應用程序中有一個datagridview。我希望能夠選擇一行或多行,然後單擊鼠標右鍵並獲取上下文菜單。上下文菜單中的選項會對選定的行執行某些操作,例如隱藏它們。對於datagridview,我有multiselect = true和selectionmode = fullrowselect。出於某種原因,datagridview.selectedrows.count始終爲0.爲什麼會這樣呢?這裏是代碼...DataGridView.SelectedRows.Count always = 0

private void Form1_Load(object sender, EventArgs e) 
    { 
     Image img = null; 
     contextMenuStrip1.Items.Add("Hide selected", img, new System.EventHandler(contextMenuStrip1_Click)); 
     contextMenuStrip1.Items.Add("Unhide all", img, new System.EventHandler(contextMenuStrip1_Click)); 
     dataGridView1.ContextMenuStrip = contextMenuStrip1; 
    } 

    private void contextMenuStrip1_Click(object sender, EventArgs e) 
    { 
     switch (sender.ToString().Trim()) 
     { 
      case "Hide selected": 
       //Necessary because a row with the current cell cannot be hidden. 
       dataGridView1.CurrentCell = null; 
       int count = dataGridView1.SelectedRows.Count; 
       foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
       { 
        row.Visible = false; 
       } 
       break; 

      case "Unhide all": 
       foreach (DataGridViewRow row in dataGridView1.Rows) 
       { 
        row.Visible = true; 
       } 
       break; 
     } 

    } 

回答

3

好吧,所以我已經設置了一個快速項目來重現你的問題。問題是你將dataGridView1.CurrentCell設置爲null。當你這樣做時,它會清除網格視圖中的選定行。我注意到你在那裏有一個評論,它必須在那裏。我並不完全確定所有的邏輯和業務領域,但你需要找到另一種方法。有了這個代碼,我沒有問題得到選定行(S):

switch (sender.ToString().Trim()) 
    { 
     case "Hide selected": 
      int count = dataGridView1.SelectedRows.Count; 
      foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
      { 
       row.Visible = false; 
      } 
      break; 

     case "Unhide all": 
      foreach (DataGridViewRow row in dataGridView1.Rows) 
      { 
       row.Visible = true; 
      } 
      break; 
    } 
+0

如果你不想隱藏當前小區,你總是可以做一個檢查,你遍歷行,看是否發件人單元格在該行中並跳過它。 – krillgar

+0

謝謝!我創建了一個新的DataGridViewSelectedRowCollection並將其設置爲等於dataGridView1.SelectedRows。然後,我刪除了dataGridView1.CurrentCell,以便可以隱藏現在的當前單元格的行。 – user1851758