2009-10-01 8 views
1

Je veux remplacer le comportement d'un clic de souris dans la cellule en-tête/colonne DataGridView (en haut, à gauche de la cellule). Cette cellule entraîne la sélection de toutes les lignes. Au lieu de cela, je veux l'empêcher de sélectionner toutes les lignes. Je vois un événement pour RowHeaderSelect et ColumnHeaderSelect, mais pas un pour cette cellule d'en-tête supérieure gauche.DataGridView override haut, gauche entête cellule click (tout sélectionner)

Des idées? Suis-je juste aveugle?

Répondre

4

Voici le code dissasembled de ce qui se passe lorsque vous cliquez sur cette cellule:

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

Pour vous éviter ce comportement, vous avez 2 solutions:

  1. multi-sélection Désactiver (si votre permis de logique métier)
  2. Hériter votre propre DataGrid et remplacent OnCellMouseDown (quelque chose comme ça)

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

Merci pour la réponse. J'ai besoin de sélectionner une ligne complète. L'autre est intrigant mais, malheureusement, le gridview a quand même sélectionné toutes les colonnes quand j'ai essayé cela auparavant. J'ai fini par désélectionner les lignes comme un travail mais pas très joli. –

+0

Donc, vous avez fait le remplacement et la sélection est toujours arrivé? J'ai fait un test rapide moi-même et cela a semblé fonctionner. – anchandra

0

Vous pourriez gagner un certain contrôle sur l'événement clic en utilisant ce hack :)

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

Je sais que c'est en retard, mais nous espérons qu'il aidera quelqu'un. Le code ci-dessous a fonctionné pour moi dans un scénario similaire.

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