2009-11-16 5 views

Répondre

58

La seule façon que j'ai trouvé à mettre en évidence « désactiver » est de définir le SelectionBackColor et le SelectionForeColor dans le DefaultCellStyle au même niveau que la BackColor et ForeColor, respectivement. Vous pouvez probablement le faire par programme sur l'événement Load du formulaire, mais je l'ai également fait dans le concepteur.

Quelque chose comme ceci:

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

Cela ne fonctionne pas si certaines cellules sont en différentes couleurs, puis par défaut backcolor . – Jovica

+3

Si vous faites défiler les lignes en définissant les couleurs, vous pouvez également définir les couleurs de sélection dans la même boucle. Ensuite, cela fonctionne très bien. Plus généralement, vous pouvez définir les couleurs de sélection à chaque fois que vous définissez les couleurs normales. – clweeks

88

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

Définir l'événement SelectionChanged appeler une méthode qui fonctionne ClearSelection

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

La question est [tag: vb.net] – Lankymart

+0

Modifications minuscules nécessaires pour vb.net mais cela fonctionne bien. Je vous remercie. Je ne comprends pas pourquoi il n'y a pas une simple propriété à activer ou désactiver sur le contrôle. –

+0

Je suppose que "ClearSelection()" déclenche à nouveau l'événement "SelectionChanged". ..... mais ce n'est pas le cas. Étrange. – boboes

4

Est-ce un websearch rapide pour savoir comment faire une sélection de datagridview non sélectionnable & a cette (page web) hit. L'appel de ClearSelection sur SelectionChanged peut provoquer et provoque un double déclenchement de l'événement SelectionChanged, au minimum.

Le premier événement est lorsque la cellule/ligne est sélectionnée et, bien sûr, l'événement SelectionChanged est déclenché. Le second tir est quand ClearSelection est appelé car il provoque (et donc logiquement!) La sélection du dataagridview à (de nouveau) changé (à aucune sélection), déclenchant ainsi SelectionChanged.

Si vous avez plus de code que simplement ClearSelection, en tant que tel, vous voudrez supprimer cet événement jusqu'à ce que votre code soit terminé. 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; 
} 
2

La meilleure façon de le faire pour traiter les cellules avec des couleurs différentes, sans avoir besoin de refire des é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 devrez ajouter un itérateur si vous autorisez plusieurs sélections

(EDIT)

en fait, cela doit être fait à temps pour la population de données. il ne semble pas fonctionner dans la méthode modifiée de sélection. Ainsi, après avoir rempli les données dans la table, vous devez parcourir les cellules et modifier leur arrière-plan sélectionné pour correspondre à leur arrière-plan normal.Quelque chose comme cela (la syntaxe peut être un peu loin, je le convertir de mon code vb):

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

Déranger et cela fonctionne aussi, comme je veux seulement changer la couleur de fond de la cellule dans la 2ème colonne lorsqu'une cellule est cliqué:

 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 
1
Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged 
    Me.DataGridView1.ClearSelection() 
End Sub 

Voilà. Mais si vous voulez toujours obtenir cliqué index de ligne/cellule ou aux valeurs d'accès:

Private Sub DataGridView1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown 
    Dim _ht As DataGridView.HitTestInfo = Me.DataGridView1.HitTest(e.X, e.Y) 
    If _ht.Type = DataGridViewHitTestType.Cell Then 
     Me.DataGridView1.Rows(_ht.RowIndex).Cells(_ht.ColumnIndex).Value = _ 
     "RowIndex = " & _ht.RowIndex & ", " & "ColumnIndex = " & _ht.ColumnIndex 
    End If 
End Sub 
0

en parler vb:

Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged 
     datagridview1.ClearSelection() 
End Sub 
Questions connexes