2013-03-26 105 views
4

我想實現一個DataGridView,它允許通過單擊行標題或通過單擊列標題選擇整個列來選擇整個行。DataGridView select RowHeader或ColumnHeader

我試着重寫OnColumnHeaderMouseClick函數並手動選擇列。這僅適用於在事件發生之前將SelectionMode設置爲ColumnHeaderSelect的情況。

任何幫助如何得到這種行爲將不勝感激!

這裏是我的DataGridView相關代碼:

public class WDSSDataGridView : DataGridView 
{ 
    protected override void OnRowHeaderMouseClick(DataGridViewCellMouseEventArgs e) 
    { 
     this.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect; 
     base.OnRowHeaderMouseClick(e); 
    } 

    protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e) 
    { 
     this.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect; 
     base.OnColumnHeaderMouseClick(e); 
    } 
} 
+0

你能分享你的代碼嗎?你使用的是WinForms DataGridView嗎? – 2013-03-26 19:23:55

+0

嗨瑞安,我使用的Winforms和我編輯我原來的帖子,以包含我有的小代碼(這與這個問題有關) – 2013-03-26 19:27:56

回答

3

我認爲你必須手動執行此操作:

protected override void OnRowHeaderMouseClick(DataGridViewCellMouseEventArgs e) { 
    this.ClearSelection(); 
    for (int i = 0; i < this.Columns.Count; ++i) { 
    this.Rows[e.RowIndex].Cells[i].Selected = true; 
    } 
    base.OnRowHeaderMouseClick(e); 
} 

protected override void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e) { 
    this.ClearSelection(); 
    for (int i = 0; i < this.Rows.Count; ++i) { 
    this.Rows[i].Cells[e.ColumnIndex].Selected = true; 
    } 
    base.OnColumnHeaderMouseClick(e);  
} 

確保SelectionMode = CellSelect

+0

爲什麼不只是使用'dgv.Rows [e.RowIndex] .Selected = true ;'等?不需要單獨獲取每個單元格。 – 2013-03-26 21:21:29

+0

@RyanFrame不能與'SelectionMode = CellSelect'一起使用,我假定OP正試圖使網格更像電子表格。 – LarsTech 2013-03-26 21:23:20

+0

@LarsTech你是正確的,我試圖使網格像電子表格一樣行事。我會試一試你的建議。謝謝! – 2013-03-27 01:44:42

1

遲到了這裏,但沒有必要手動執行此操作(即循環遍歷整個dgv)。

該OP非常接近你所需要的。只需捕獲列和行的標題單擊事件並相應地設置選擇模式。然後強行選擇他們點擊的任何列/行。

這使得它的功能就像一個Excel電子表格,您可以單獨選擇單元格,或者通過單擊標題來選擇整個列/行。您也可以通過按住Shift/Ctrl鍵來選擇多個列/行。它也允許Shift-Space選擇整個Column/Row(取決於你所在的模式)。這與Excel類似,但Excel允許不同的功能:Shift-Space選擇行並按Ctrl-Space選擇列,但嘿...我們不能擁有所有功能。

只要確保您的dgv的初始SelectionMode是Column/RowHeaderSelect或CellSelect,而不是FullColumn/RowSelect,否則它們在點擊列/行標題之前的第一次點擊將無法按要求運行。

Private Sub dgvView_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvView.ColumnHeaderMouseClick 
    With dgvView 
     If .SelectionMode <> DataGridViewSelectionMode.ColumnHeaderSelect Then 
      .SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect 
      .Columns(e.ColumnIndex).Selected = True 
     End If 
    End With 
End Sub 
Private Sub dgvView_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvView.RowHeaderMouseClick 
    With dgvView 
     If .SelectionMode <> DataGridViewSelectionMode.RowHeaderSelect Then 
      .SelectionMode = DataGridViewSelectionMode.RowHeaderSelect 
      .Rows(e.RowIndex).Selected = True 
     End If 
    End With 
End Sub 
+0

是的,這也適用。 – LarsTech 2018-03-07 17:25:19

相關問題