2010-11-30 7 views

Répondre

91

Pour désélectionner toutes les lignes et les cellules dans un DataGridView, vous pouvez utiliser le ClearSelection method:

myDataGridView.ClearSelection() 

Si vous ne voulez même pas la première ligne/cellule à apparaître sélectionnée, vous pouvez régler la CurrentCell property-Nothing/null qui masquera temporairement le rectangle de mise au point jusqu'à ce que le contrôle reçoit le focus nouveau:

myDataGridView.CurrentCell = Nothing 

Pour déterminer quand l'utilisateur a cliqué sur une partie vide du DataGridView, vous devrez gérer son événement MouseUp. Dans ce cas, vous pouvez HitTest l'emplacement du clic et regarder pour indiquer HitTestInfo.Nowhere. Par exemple:

Private Sub myDataGridView_MouseUp(ByVal sender as Object, ByVal e as System.Windows.Forms.MouseEventArgs) 
    ''# See if the left mouse button was clicked 
    If e.Button = MouseButtons.Left Then 
     ''# Check the HitTest information for this click location 
     If myDataGridView.HitTest(e.X, e.Y) = DataGridView.HitTestInfo.Nowhere Then 
      myDataGridView.ClearSelection() 
      myDataGridView.CurrentCell = Nothing 
     End If 
    End If 
End Sub 

Bien sûr, vous pouvez également sous-classe le contrôle DataGridView existant de combiner toutes ces fonctionnalités en un seul contrôle personnalisé. Vous devrez remplacer son OnMouseUp method de la manière indiquée ci-dessus. Je tiens également à fournir une méthode publique DeselectAll pour plus de commodité qui appelle la méthode ClearSelection et définit la propriété CurrentCell à Nothing.

(exemples de code sont tous arbitrairement en VB.NET parce que la question ne précise pas une langue-excuses si ce n'est pas votre dialecte natif.)

+0

Cela ne semble pas fonctionner pour moi, je l'ai, mais mon travail ne datagridview pas un '= HitTestInfo.Nowhere' je devais changer pour .... . 'Si myDataGridView.HitTest (eX, eY) est myDataGridView.HitTest (eX, eY) Then ... fonctionne comme prévu, mais pas à 100% pourquoi cela fonctionne. Premier code HitTest implémenté. – nora

+0

@nora Le code que vous avez écrit n'a vraiment aucun sens. Ça n'aurait pas dû marcher. L'opérateur ['Is'] (https://msdn.microsoft.com/en-us/library/kb136x1y.aspx) compare les types de deux variables de référence. Tout ce que vous faites, c'est de vérifier que la propriété 'HitTest' renvoie une valeur du même type que la propriété ...' HitTest'. C'est comme dire "Si Vrai = Vrai". –

+0

@nora (suite) En réalité, la propriété ['HitTest'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.hittest.aspx) renvoie une valeur de type 'HitTestInfo'. ['HitTestInfo'] (https://msdn.microsoft.com/fr-fr/library/system.windows.forms.datagridview.hittestinfo.aspx) est une classe non-héritable qui contient, entre autres, un champ statique nommé 'Nowhere'. C'est le domaine que vous devez comparer. Je suppose que ce qui vous trébuche est que la classe 'HitTestInfo' est une classe * nested * de' DataGridView'. J'ai mis à jour ma réponse pour la qualifier explicitement. –

1

Set

dgv.CurrentCell = null; 

lorsque l'utilisateur clique sur une partie vide de la DGV.

6

Merci Cody Heres C# pour ref:

if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      DataGridView.HitTestInfo hit = dgv_track.HitTest(e.X, e.Y); 
      if (hit.Type == DataGridViewHitTestType.None) 
      { 
       dgv_track.ClearSelection(); 
       dgv_track.CurrentCell = null; 
      } 
     } 
0

i ont couru dans le même problème et trouvé une solution (pas tout à fait par moi-même, mais il y a Internet pour)

Color blue = ColorTranslator.FromHtml("#CCFFFF"); 
Color red = ColorTranslator.FromHtml("#FFCCFF"); 
Color letters = Color.Black; 

foreach (DataGridViewRow r in datagridIncome.Rows) 
{ 
    if (r.Cells[5].Value.ToString().Contains("1")) { 
     r.DefaultCellStyle.BackColor = blue; 
     r.DefaultCellStyle.SelectionBackColor = blue; 
     r.DefaultCellStyle.SelectionForeColor = letters; 
    } 
    else { 
     r.DefaultCellStyle.BackColor = red; 
     r.DefaultCellStyle.SelectionBackColor = red; 
     r.DefaultCellStyle.SelectionForeColor = letters; 
    } 
} 

Ce petit truc, la seule façon de ca n voir qu'une ligne est sélectionnée, c'est par la toute première colonne (pas la colonne [0], mais l'une donc). Lorsque vous cliquez sur une autre ligne, vous ne verrez plus la sélection bleue, seule la flèche indique quelle ligne a été sélectionnée. Comme vous le comprenez, j'utilise rowSelection dans ma grille.

1

J'ai découvert pourquoi ma première ligne était sélectionnée par défaut et j'ai découvert comment ne pas la sélectionner par défaut.

Par défaut, mon datagridview était l'objet avec le premier tab-stop sur mon formulaire Windows. Faire la tabulation d'abord sur un autre objet (peut-être désactiver tabstop pour la grille de données du tout fonctionnera) désactivé la sélection de la première rangée

+0

Cela a effectivement résolu mon problème aussi. Pour une raison étrange, changer la propriété 'TabStop' en' false' semble charger le formulaire sans une cellule/index 'DataGridView' sélectionné. – Apostrofix

+0

Cela ne fonctionne pas. Si vous définissez un point d'arrêt sur l'événement SelectionChanged et activez .NET Framework Source Stepping, vous pouvez voir un appel de OnHandleCreated() à MakeFirstDisplayedCellCurrentCell(). C'est pourquoi cela arrive, pas parce qu'il peut être "tabulé". – computerGuyCJ

0

En VB.l'utilisation des moustiquaires pour la sous:

Private Sub dgv_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv.MouseUp 
    ' deselezionare se click su vuoto 
    If e.Button = MouseButtons.Left Then 
     ' Check the HitTest information for this click location 
     If Equals(dgv.HitTest(e.X, e.Y), DataGridView.HitTestInfo.Nowhere) Then 
      dgv.ClearSelection() 
      dgv.CurrentCell = Nothing 
     End If 
    End If 
End Sub 
Questions connexes