2008-10-06 10 views

Répondre

15
// Clear all the previously selected rows 
    foreach (DataGridViewRow row in yourDataGridView.Rows) 
    { 
     row.Selected = false; 
    } 

    // Get the selected Row 
    DataGridView.HitTestInfo info = yourDataGridView.HitTest(e.X, e.Y); 

    // Set as selected 
    yourDataGridView.Rows[info.RowIndex].Selected = true; 
+3

cela devient vraiment lent lorsque le nombre de lignes est élevé ... – karlipoppins

+2

Si votre DataGridView a MultiSelect défini sur false puis effacer la sélection précédente est inutile. En outre, HitTestInfo peut renvoyer HitTestInfo.Nowhere si l'accès n'est pas une ligne/colonne valide. – stuartd

+0

Impossible .ClearSelection aide-t-il à accélérer les choses? – ccalboni

5

la chose est cool ajouter un menu sur ce clic droit, par exemple avec option comme « Affichage des informations client », « vérifier dernières factures », « Ajouter une entrée de journal à ce client », etc.

vous avez juste besoin d'ajouter un objet ContextMenuStrip, ajoutez vos entrées de menu, et dans les propriétés DataGridView sélectionnez simplement le ContextMenuStrip de celui-ci.

Cela crée un nouveau menu dans la ligne droite l'utilisateur a cliqué avec toutes les options, tout ce que vous devez faire est de rendre votre magie :)

rappelez-vous que vous avez besoin du code JvR pour obtenir ce que la ligne était la utilisateur, puis prenez la cellule qui contient l'ID client par exemple et transmettre cette information.

it helps améliorer votre application

http://img135.imageshack.us/img135/5246/picture1ku5.png

http://img72.imageshack.us/img72/6038/picture2lb8.png

0

Vous pouvez utiliser le code de JvR en cas MouseDown de votre DataGridView.

3

le DataGridView et Sous créer un événement MouseDown pour le réseau,


private void SubClassedGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Sets is so the right-mousedown will select a cell 
    DataGridView.HitTestInfo hti = this.HitTest(e.X, e.Y); 
    // Clear all the previously selected rows 
    this.ClearSelection(); 

    // Set as selected 
    this.Rows[hti.RowIndex].Selected = true; 
} 
17

qu'il se comporte de façon similaire au bouton gauche de la souris? par exemple.

private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     dataGridView.CurrentCell = dataGridView[e.ColumnIndex, e.RowIndex]; 
    } 
} 
+0

Cela a bien fonctionné pour moi, merci! – Superbeard

+3

Ceci est plus flexible et complet que la réponse de JvR, mais vous devriez ajouter une vérification de 'e.ColumnIndex> = 0 && e.RowIndex> = 0' au cas où l'utilisateur clique avec le bouton droit de la souris sur un en-tête. – Chad

0

Vous devez faire deux choses:

  1. Effacer toutes les lignes et sélectionner le courant. Je boucle à travers toutes les lignes et utiliser l'expression Bool i = e.RowIndex pour cette

  2. Si vous avez fait l'étape 1 vous avez encore un grand écueil:
    DataGridView1.CurrentRow ne retourne pas votre ligne précédemment sélectionnée (ce qui est très dangereux). Depuis CurrentRow est Readonly que vous devez faire

    Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex)

    Protected Overrides Sub OnCellMouseDown(
        ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 
    
        MyBase.OnCellMouseDown(e) 
    
        Select Case e.Button 
         Case Windows.Forms.MouseButtons.Right 
          If Me.Rows(e.RowIndex).Selected = False Then 
           For i As Integer = 0 To Me.RowCount - 1 
            SetSelectedRowCore(i, i = e.RowIndex) 
           Next 
          End If 
    
          Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex) 
        End Select 
    
    End Sub 
    
Questions connexes