45 votes

Désactiver la mise en surbrillance des cellules dans un datagridview

Comment désactiver la surbrillance de cellule dans une vue de datagrid, la surbrillance ne devrait pas se produire même si je clique sur la cellule.

Toutes les pensées s'il vous plaît

107voto

Zurahn Points 4682

Le kludge ForeColor / BackColor ne fonctionnait pas pour moi, car j'avais des cellules de couleurs différentes. Donc, pour toute personne au même endroit, j'ai trouvé une solution plus proche de la désactivation de la capacité.

Définissez l'événement SelectionChanged pour appeler une méthode qui exécute ClearSelection

 private void datagridview_SelectionChanged(object sender, EventArgs e)
{
    this.datagridview.ClearSelection();
}
 

74voto

jheddings Points 10510

Le seul moyen que j'ai trouvé pour "désactiver" la mise en évidence est de définir le SelectionBackColor et le SelectionForeColor dans le DefaultCellStyle sur le même que le BackColor et ForeColor , respectivement. Vous pourriez probablement le faire par programme sur l'événement Load du formulaire, mais je l'ai également fait dans le concepteur.

Quelque chose comme ça:

 Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
 

5voto

KCromm Points 31

Fait une rapide recherche internet pour savoir comment faire un datagridview sélection non-sélectionnable et a du ce (page web) a frappé.

L'appel de ClearSelection sur SelectionChanged peut causer un double tir de l'événement SelectionChanged, au minimum.

Le premier cas est lorsque la cellule/ligne est sélectionnée et, bien sûr, la SelectionChanged événement est déclenché. La seconde cuisson est quand ClearSelection est appelé, car il provoque (et logiquement, donc!) la sélection de la datagridview (de nouveau) modifié (pas de sélection), déclenchant ainsi SelectionChanged.

Si vous avez plus de code que de simplement ClearSelection, comme tel, je n', vous aurez envie de supprimer cet événement jusqu'à ce que votre code est fait. Voici un exemple:

 private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
  //suppresss the SelectionChanged event
  this.dgvMyControl.SelectionChanged -= dgvMyControl_SelectionChanged;

  //grab the selectedIndex, if needed, for use in your custom code
  // do your custom code here

  // finally, clear the selection & resume (reenable) the SelectionChanged event 
  this.dgvMyControl.ClearSelection();
  this.dgvMyControl.SelectionChanged += dgvMyControl_SelectionChanged;
}

3voto

LairdPleng Points 94

Le moyen le plus rapide pour faire cela pour traiter les cellules avec des couleurs différentes, sans avoir besoin de refire tous les événements, serait de faire quelque chose comme ceci:

private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
    dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.SelectionBackColor = dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.BackColor

}
Vous aurez besoin de mettre dans un itérateur si vous autoriser les sélections multiples

(EDIT)

en fait, ce qui doit être fait à temps pour les données de population. il ne semble pas travailler dans le changement de la sélection de la méthode. Donc, après avoir rempli les données dans la table, vous avez besoin de parcourir les cellules et modifier leurs arrière-plan sélectionné pour correspondre à leur base normale. Quelque chose comme ceci (syntaxe peut être un peu hors, je suis de la conversion à partir de mon code vb):

foreach (datarow r in dgv.rows)
{
  foreach (datacell c in r.cells)
  {
     c.Style.SelectionBackColor = c.Style.BackColor
  }
}

1voto

Data Points 58

Déconner et cela fonctionne aussi, car je veux seulement changer la couleur d'arrière-plan de la cellule dans la 2e colonne quand une cellule est cliquée:

         Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick

    Dim row As Integer = DataGridView1.CurrentCellAddress.Y
    Dim column As Integer = DataGridView1.CurrentCellAddress.X

    If column = 1 Then
        Me.DataGridView1.CurrentCell.Selected = False
        DataGridView1.Item(column, row).Style.BackColor = SelectColour()
    End If

End Sub
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X