jueves, noviembre 21, 2024

Limitar el número de Rows en el DataGrid

Con este código puedes restringir la cantidad de registros que deseamos ingresar en nuestro DataGrid.

Para esto vamos a crear un control que herede de System.Windows.Forms.DataGrid y vamos a sobreescribir el procedimiento ColumnStartedEditing, que se ejecuta siempre que se edita algún dato del DataGrid.

También vamos a necesitar una función que nos retorne el numero de rows en el DataGrid, para comparar con el valor que nosotros le indiquemos. Ver función CuentaLineasDataGrid.

Otra función que vamos a necesitar es la que publicamos en un artículo anterior, «Impedir agregar nuevos rows en el Datagrid», que nos elimina la línea del asterisco, que está al final del DataGrid y le indicamos al DataView que no acepte mas registros. Ver función PermiritNewRow.

Al crear las propiedades AceptarNewRows() y CantidadRowsPermitidos(), cuando agreguemos el DataGrid que acabamos de modificar, en la ventana de propiedades vamos a poder controlarlos:

Le indicamos el si aceptamos nuevos rows, valores True o False

Le indicamos la cantidad de rows máximo que deseamos ingresar, en el caso de que no necesitemos un límete de rows le dejamos el valor defaul 0.

El código completo aquí:

Imports System.ComponentModel
Imports System.Windows.Forms

Public Class MyDataGrid
Inherits System.Windows.Forms.DataGrid

#Region » Variables «

Private _CantidadRowsPermitidos As Integer = Nothing
Private _AceptarNewRows As Boolean = True

#End Region

#Region » Propiedades «

<Description(«Indica la cantidad de rows permitidos en el DataGrid»)> _
Public Property CantidadRowsPermitidos() As Integer
Get
Return _CantidadRowsPermitidos
End Get
Set(ByVal Value As Integer)
_CantidadRowsPermitidos = Value
End Set
End Property

<Description(«Indica si se permite agregar nuevos rows al DataGrid»)> _
Public Property AceptarNewRows() As Boolean
Get
Return _AceptarNewRows
End Get
Set(ByVal Value As Boolean)
_AceptarNewRows = Value
End Set
End Property

#End Region

'Procedimiento que le indica al datagrid si se pueden agregar o no mas rows
Private Sub PermiritNewRow(ByVal valor As Boolean)
Try
Dim cm As CurrencyManager = CType(Me.BindingContext(Me.DataSource, Me.DataMember), CurrencyManager)
CType(cm.List, DataView).AllowNew = valor
Catch ex As Exception
Throw ex
End Try
End Sub

<Description(«Retorna el número de rows en el DataGrid»)> _
Public Function CuentaLineasDataGrid() As Integer
Try
Dim numRows As Integer = Me.BindingContext(Me.DataSource, Me.DataMember).Count
Return numRows
Catch ex As Exception
Throw ex
End Try
End Function

Protected Overloads Overrides Sub ColumnStartedEditing(ByVal bounds As System.Drawing.Rectangle)
Try
If Me.AceptarNewRows Then
If Me.CuentaLineasDataGrid <= CantidadRowsPermitidos Or
CantidadRowsPermitidos = 0 Then
MyBase.ColumnStartedEditing(bounds)
AceptarNewRows = True
Else
AceptarNewRows = False
End If
Else
AceptarNewRows = False
End If

PermiritNewRow(AceptarNewRows)
Catch ex As Exception
Throw ex
End Try
End Sub

End Class

Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub
Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub