3

DataGridView ヘッダー/列セル (上、左のセル) でのマウス クリックの動作をオーバーライドしたいと考えています。そのセルにより、すべての行が選択されます。代わりに、すべての行を選択しないようにします。RowHeaderSelect と ColumnHeaderSelect のイベントが表示されますが、左上のヘッダー セルのイベントは表示されません。

何か案は?私は盲目なだけですか?

4

4 に答える 4

5

これは、そのセルをクリックしたときに何が起こるかを分解したコードです。

private void OnTopLeftHeaderMouseDown()
{
    if (this.MultiSelect)
    {
        this.SelectAll();
        if (-1 != this.ptCurrentCell.X)
        {
            this.SetCurrentCellAddressCore(this.ptCurrentCell.X, this.ptCurrentCell.Y, false, false, false);
        }
    }

この動作を防ぐために、2つの解決策があります。

  1. 複数選択を無効にする(ビジネスロジックで許可されている場合)
  2. 独自のデータグリッドを継承してオーバーライドしますOnCellMouseDown(このようなもの)

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    {
        if (e.RowIndex == -1 && e.ColumnIndex == -1) return;
        base.OnCellMouseDown(e);
    }
    
于 2009-10-28T19:04:37.197 に答える
2

私はこれが遅れていることを知っていますが、うまくいけば誰かを助けるでしょう. 以下のコードは、同様のシナリオで機能しました。

    private void MyDataGridView_MouseUp(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo hitInfo = this.MyDataGridView.HitTest(e.X, e.Y);
        if (hitInfo.Type == DataGridViewHitTestType.TopLeftHeader)
        {
            MyDataGridView.ClearSelection();
        }
     }
于 2015-09-01T16:16:02.533 に答える
0

このハックを使用して、クリックイベントをある程度制御できます:)

private void dataGridView1_Click(object sender, EventArgs e)
{
    MouseEventArgs args = (MouseEventArgs)e;
    DataGridView dgv = (DataGridView)sender;
    DataGridView.HitTestInfo hit = dgv.HitTest(args.X, args.Y);
    if (hit.Type == DataGridViewHitTestType.TopLeftHeader)
    {
        // do something here
    }
}
于 2009-11-16T19:36:10.347 に答える