2009-10-01 3 views
1

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

Любые идеи? Я просто слепой?

ответ

4

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

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. Наследовать свой собственный DataGrid и переопределить OnCellMouseDown (что-то вроде этого)

    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) 
    { 
        if (e.RowIndex == -1 && e.ColumnIndex == -1) return; 
        base.OnCellMouseDown(e); 
    } 
    
+0

Благодарим за отзыв. Мне нужен полный выбор строки. Другой интригует, но, к сожалению, gridview все еще выбрал все столбцы, когда я пробовал это раньше. Я закончил тем, что не выбрал строки как работу, но не очень красивую. – 2009-11-17 14:53:19

+0

Итак, вы сделали переопределение, и выбор все же произошел? Я сделал быстрый тест сам, и это, казалось, сработало. – anchandra

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

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

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