DataGridView переопределяет верхнюю часть, щелчок левой ячейки заголовка (выбрать все)

Я хочу переопределить поведение щелчка мыши в ячейке заголовка / столбца DataGridView (верхняя левая ячейка). Эта ячейка вызывает выбор всех строк. Вместо этого я хочу остановить выбор всех строк. Я вижу событие для RowHeaderSelect и ColumnHeaderSelect, но не одно для этой верхней левой ячейки заголовка.

Есть идеи? Я просто слепой?

3 ответа

Это растерянный код того, что происходит, когда вы нажимаете эту ячейку:

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);
    }
    

Я знаю, что уже поздно, но, надеюсь, это кому-нибудь поможет. Код ниже работал для меня в аналогичном сценарии.

    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();
        }
     }

Вы можете получить некоторый контроль над событием click, используя этот хак:)

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
    }
}

Переопределить метод OnCellMouseDown:

if (e.ColumnIndex == -1 && e.RowIndex == -1)
{
return;
}
else
{
base.OnCellMouseDown(e);
}
Другие вопросы по тегам