.net - validacion - condicional para bloquear celdas
Deshabilitar celdas resaltadas en una vista de cuadrĂcula de datos (8)
Cómo desactivar resaltado de celda en una vista de cuadrícula de datos, resaltar no debería suceder incluso si hago clic en la celda.
Cualquier pensamiento por favor
Dando vueltas y esto también funciona, ya que solo quiero cambiar el color de fondo de la celda en la segunda columna cuando se hace clic en una celda:
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
ForeColor / BackColor kludge no funcionaba para mí, porque tenía células de diferentes colores. Entonces, para cualquiera en el mismo lugar, encontré una solución más parecida a la desactivación de la habilidad.
Establezca el evento SelectionChanged
para llamar a un método que ejecuta ClearSelection
private void datagridview_SelectionChanged(object sender, EventArgs e)
{
this.datagridview.ClearSelection();
}
Hice una búsqueda web rápida para descubrir cómo hacer que una selección de vista de cuadrícula de datos no sea seleccionable y obtuve esta (página web) presionada.
Llamar a ClearSelection en SelectionChanged puede causar y provoca una doble activación del evento SelectionChanged, como mínimo.
El primer evento es cuando se selecciona la celda / fila y, por supuesto, se dispara el evento SelectionChanged. El segundo disparo es cuando ClearSelection se llama ya que provoca (y lógicamente así) la selección de la vista de tabla de datos a (nuevamente) cambiado (a ninguna selección), disparando SelectionChanged.
Si tiene más código que simplemente ClearSelection, como hago yo, querrá suprimir este evento hasta que haya terminado su código. Aquí hay un ejemplo:
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;
}
en vb hablar:
Private Sub datagridview1_SelectionChanged(sender As Object, e As EventArgs) Handles datagridview1.SelectionChanged
datagridview1.ClearSelection()
End Sub
La única forma que he encontrado para "deshabilitar" el resaltado es establecer SelectionBackColor
y SelectionForeColor
en DefaultCellStyle
al igual que BackColor
y ForeColor
, respectivamente. Probablemente pueda hacer esto programáticamente en el evento Load
del formulario, pero también lo he hecho en el diseñador.
Algo como esto:
Me.DataGridView1.DefaultCellStyle.SelectionBackColor = Me.DataGridView1.DefaultCellStyle.BackColor
Me.DataGridView1.DefaultCellStyle.SelectionForeColor = Me.DataGridView1.DefaultCellStyle.ForeColor
La forma más rápida de hacer esto para manejar celdas con diferentes colores, sin necesidad de refinar ningún evento, sería hacer algo como esto:
private void dgvMyControl_SelectionChanged(object sender, EventArgs e)
{
dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.SelectionBackColor = dgvMyControl.SelectedCells(0).Style.DefaultCellStyle.BackColor
}
Deberá ingresar un iterador si permite múltiples selecciones
(EDITAR)
en realidad, esto debe hacerse al momento para la población de datos. no parece funcionar en el método de cambio de selección activada. Por lo tanto, después de completar los datos en la tabla, debe recorrer las celdas y cambiar el fondo seleccionado para que coincida con su fondo normal. Algo como esto (la sintaxis puede estar un poco desajustada, la estoy convirtiendo de mi código vb):
foreach (datarow r in dgv.rows)
{
foreach (datacell c in r.cells)
{
c.Style.SelectionBackColor = c.Style.BackColor
}
}
Private Sub DGW2_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DGW2.DataBindingComplete
Dim mygrid As DataGridView
mygrid = CType(sender, DataGridView)
mygrid.ClearSelection()
End Sub
Private Sub DataGridView1_SelectionChanged(sender As Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged
Me.DataGridView1.ClearSelection()
End Sub
Eso es. Pero si aún desea hacer clic en el índice de fila / celda o para acceder a los valores:
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