2009-11-16 25 views

risposta

58

L'unico modo che ho trovato per l'evidenziazione "disable" è quello di impostare la SelectionBackColor e la SelectionForeColor nel DefaultCellStyle per lo stesso del BackColor e ForeColor, rispettivamente. Probabilmente potresti farlo a livello di codice sull'evento Load del modulo, ma l'ho fatto anche nel designer.

Qualcosa di simile a questo:

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

Questo non funziona se alcune cellule sono in diversi colori di default allora backcolor . – Jovica

+3

Se si esegue il loop delle righe, impostando i colori, è possibile anche impostare i colori di selezione nello stesso ciclo. Quindi funziona bene. Più in generale, è possibile impostare i colori di selezione ogni volta che si impostano i colori normali. – clweeks

88

Il ForeColor/BackColor kludge non funzionava per me, perché avevo le cellule di diversi colori. Quindi, per chiunque si trovi nello stesso punto, ho trovato una soluzione più simile alla disabilitazione effettiva dell'abilità.

impostare l'evento SelectionChanged di chiamare un metodo che corre ClearSelection

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

La domanda è [tag: vb.net] – Lankymart

+0

Piccole modifiche necessarie per vb.net ma questo funziona bene. Grazie. Non capisco perché non ci sia una semplice proprietà da accendere o spegnere sul controllo. –

+0

Mi aspetto che "ClearSelection()" firmi di nuovo l'evento "SelectionChanged". ..... ma non è così. Strano. – boboes

4

fatto una rapida ricerca sul web per scoprire come fare una selezione datagridview non selezionabile & ottenuto questo (pagina web) colpo.

La chiamata a ClearSelection su SelectionChanged può provocare un doppio incendio dell'evento SelectionChanged, come minimo.

Il primo evento è quando viene selezionata la cella/riga e, ovviamente, viene attivato l'evento SelectionChanged. La seconda attivazione avviene quando ClearSelection viene chiamato in quanto causa (e logicamente!) La selezione della vista datagrid a (di nuovo) modificata (in nessuna selezione), attivando quindi SelectionChanged.

Se si dispone di più codice rispetto alla semplice ClearSelection in corso, come tale io, si desidera sopprimere questo evento fino a dopo aver terminato il codice. Ecco un esempio:

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

Il modo più rapido per fare questo per gestire le cellule con colori diversi, senza la necessità di refire eventi, sarebbe quello di fare qualcosa di simile:

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

} 
Sarà necessario inserire un iteratore se si consentono più selezioni

(EDIT)

in realtà, questo deve essere fatto in tempo per la popolazione di dati. non sembra funzionare nel metodo di selezione on modificato. Quindi, dopo aver inserito i dati nella tabella, è necessario scorrere le celle e modificare lo sfondo selezionato in modo che corrisponda allo sfondo normale.Qualcosa di simile a questo (sintassi può essere un po 'fuori, sto convertendolo da mio codice vb):

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

Nei guai e questo funziona anche, come ho solo voglia di cambiare il colore di sfondo della cella nella 2a colonna quando una cellula viene fatto clic:

 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 

Questo è tutto. Ma se si vuole ancora ottenere fila cliccato/indice cella oa valori di accesso:

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

in VB parlare:

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