4

行ヘッダーをクリックして行全体を選択するか、列ヘッダーをクリックして列全体を選択できるDataGridViewを実装しようとしています。

OnColumnHeaderMouseClick関数をオーバーライドして、手動で列を選択してみました。これは、イベントが発生する前にSelectionModeをColumnHeaderSelectに設定した場合にのみ機能します。

この動作を取得する方法についてのヘルプをいただければ幸いです。

これが私のDataGridViewからの関連コードです:

public class CustomDataGridView : 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);
    }
}
4

2 に答える 2

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

于 2013-03-26T21:16:50.870 に答える
1

ここでのパーティーに遅れますが、これを手動で行う必要はありません(つまり、dgv全体をループします)。

OPはあなたが必要とするものにかなり近かった。列と行のヘッダークリックイベントをキャプチャし、それに応じてSelectionModeを設定するだけです。次に、クリックした列/行を強制的に選択します。

これにより、セルを個別に選択するか、ヘッダーをクリックして列/行全体を選択できるExcelスプレッドシートのように機能します。Shift / Ctrlキーを押しながら、複数の列/行を選択することもできます。また、Shift-Spaceで列/行全体を選択することもできます(現在のモードによって異なります)。これはExcelに似ていますが、Excelでは行を選択するためのShiftキーと列を選択するためのCtrlキーとスペースという異なる機能が使用できる点が異なりますが、すべてを使用することはできません。

dgvの最初のSelectionModeが、FullColumn/RowSelectではなくColumn/RowHeaderSelectまたはCellSelectであることを確認してください。そうしないと、Column/Rowヘッダーをクリックする前の最初のクリックが期待どおりに機能しません。

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
于 2018-03-06T22:34:21.617 に答える