2010-10-12 21 views
3

我有一個gridview,我可以通過按下一個控制鍵來選擇多行。無需按下控制鍵,是否可以達到相同的效果?不按控制鍵可以選擇多個行

+0

如果您選擇多個行而沒有控制鍵,您將如何取消選擇它們? – Giorgi 2010-10-12 14:33:21

+0

@Giorgi再次單擊一行 – Bolu 2010-10-12 14:38:35

回答

5

作爲.NET默認的動作也將更新的slectedrowsdatagridview你需要有一個數組來保留舊的選擇:

DataGridViewRow[] old; 

將在CellMouseDown(更新默認.NET行動之前修改您的選擇):

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    old = new DataGridViewRow[dataGridView1.SelectedRows.Count]; 
    dataGridView1.SelectedRows.CopyTo(old,0); 
} 

在這之後,你可以做你的變化​​(如RowHeaderSelect是默認的datagridview selectionmode)或FullRowSelect使用CellMouseClick並重新選擇那些老所選行:

private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{  
    foreach (DataGridViewRow gr in old) 
    { 
     if (gr == dataGridView1.CurrentRow) 
     { 
      gr.Selected = false; 
     } 
     else 
     { 
      gr.Selected = true; 
     }  
    } 
} 

編輯:更好的解決方案:
你需要實現自己的datagridview從原來的一個派生並重寫OnCellMouseDown & OnCellMouseClick取消默認取消選擇操作並使其平滑。創建一個新類的東西是這樣的:

Using System; 
Using System.Windows.Forms; 

public class myDataGridView:DataGridView 
{ 
    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) 
    { 
     //base.OnCellMouseDown(e); 
     this.Rows[e.RowIndex].Selected = !this.Rows[e.RowIndex].Selected; 
    } 

    protected override void OnCellMouseClick(DataGridViewCellMouseEventArgs e) 
    { 
     //base.OnCellMouseClick(e); 
    } 
} 

,並在您Form.Designer.cs改變DataGridView對象datagridview1(如果是這樣的名稱)myDataGridView對象......

例如:更改

private System.Windows.Forms.DataGridView dataGridView1;

private myDataGridView dataGridView1; 

,改變

this.dataGridView1=new System.Windows.Forms.DataGridView()

this.dataGridView1=new myDataGridView() 
+0

但我使用的是FullRowSelect選擇模式。我無法找到FullRowSelectMouseClick事件。 – Hukam 2010-10-13 06:57:34

+0

只是使用cellMouseClick然後.. – Bolu 2010-10-13 16:34:33

+0

我已經測試過u'r代碼,但它看起來像每次我選擇任何行刷新網格。 – Hukam 2010-10-14 12:45:02

0

您需要訂閱鼠標單擊事件並通過將Selected屬性設置爲true以編程方式選擇行。

請記住,如果行已被選中,您需要將其設置爲false,以便用戶能夠取消選擇該行。

0

我從來沒有這樣做過,但應該可以使用MouseDown和MouseUp事件來選擇當按住其中一個按鈕時移動鼠標時在光標下的任何行。

1

了最簡單的方法可以把一個複選框,每一行和可能的「全選」複選框上的頭英寸

0

我不得不爲觸摸屏做到這一點,我想單擊一下多選,而不會看到難看的複選框。 爲什麼在它複雜化,只是保持不的Index'es

private List<int> SelectedIndexs { get; set; } 

然後根據需要添加或單擊它們從列表中刪除它們...... 然後看通過你的DataGrid,並在列表中選擇行。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (SelectedIndexs.Contains(e.RowIndex)) 
     { 
      SelectedIndexs.Remove(e.RowIndex); 
     } 
     else 
     { 
      SelectedIndexs.Add(e.RowIndex); 
     } 

     foreach (DataGridViewRow row in this.dataGridView1.Rows) 
     { 
      row.Selected = SelectedIndexs.Contains(row.Index); 
     } 
    } 
相關問題