DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Modificando el TabControl de .NET a TabControlEx

Por royrojas | 7/5/2005 | Visitas 12,485 | Voto 4.00
En .Net podemos modificar los controles que nos provee y en este ejemplo agregaremos la opción de deshabilitar los TapPages al TabControl.
Categorías : VB.NET, Componentes VB.NET
Agregar funcionalidades a los controles que proporciona el .NET Framework 1.x es algo que tenemos que hacer cuando estos no cumplen las necesidades de nuestra aplicación.
Introducción: En este artículo tratare de dar una instroducción al tema. En el ejemplo agregaremos la opcion de "deshabilitar" los TapPages.

En .NET tenemos muchas opciones de controles, pero muchos de estos no vienen del todo completos, por eso tenemos que reprogramarlos nosotros mismos para agregarle las funcionalidades que necesitemos.

Uno de estos controles que utilizamos a menudo pero que a veces se nos queda corto es el TabControl, ya que no tiene la opcion para habilitar TapPages. Por seguridad en algunas aplicaciones se necesita que los usuarios no puedan entrar a determinado Tab.

Para esto vamos a crear un control llamado "TabControlEX" con esta nueva funcionalidad que utilizaremos luego en la aplicación de ejemplo.

Código:
Option Strict On

Public Class TabControlEx
Inherits System.Windows.Forms.TabControl
Private Const WM_LBUTTONDOWN As Integer = &H201

Protected Overrides Sub WndProc (ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_LBUTTONDOWN Then
Dim pt As New Point(m.LParam.ToInt32)
Dim index As Integer
For index = 0 To Me.TabPages.Count - 1
If GetTabRect(index).Contains(pt) Then
If TabPages(index).Enabled Then
MyBase.WndProc(m)
End If
Exit Sub
End If
Next
End If
MyBase.WndProc(m)
End Sub

Protected Overrides Sub OnKeyDown (ByVal ke As System.Windows.Forms.KeyEventArgs)
Dim currentIndex As Integer = Me.SelectedIndex
Dim index As Integer
If ke.KeyCode = Keys.Left AndAlso _
Not (ke.Alt AndAlso Not ke.Control) _
Then
For index = currentIndex - 1 To 0 Step -1
If TabPages(index).Enabled Then
Me.SelectedIndex = index
Exit For
End If
Next
ke.Handled = True
ElseIf ke.KeyCode = Keys.Right AndAlso Not (ke.Alt AndAlso Not ke.Control) Then
For index = currentIndex + 1 To TabPages.Count - 1
If TabPages(index).Enabled Then
Me.SelectedIndex = index
Exit For
End If
Next
ke.Handled = True
End If
MyBase.OnKeyDown(ke)
End Sub

Public Sub DisablePage(ByRef pTabPage As TabPage)
pTabPage.Enabled = False
End Sub

Private Sub TabControlEx_DrawItem _
(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) _
Handles MyBase.DrawItem

Try
Dim intOffsetLeft As Int32
Dim intOffsetTop As Int32
Dim r As RectangleF = RectangleF.op_Implicit(e.Bounds)
Dim r2 As RectangleF
Dim ItemBrush As New SolidBrush(Me.BackColor)
Dim b As Brush
If Me.TabPages(e.Index).Enabled Then
b = Brushes.Black
Else
b = Brushes.Gray
End If

Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center

Dim im As Bitmap
If Me.TabPages(e.Index).ImageIndex <> -1 Then
im = CType(Me.ImageList.Images (Me.TabPages(e.Index).ImageIndex), Bitmap)
End If

If Me.TabPages(e.Index).ImageIndex <> -1 Then
r2 = New RectangleF(r.X + (im.Width \ 2), r.Y, r.Width, r.Height)
Else
r2 = New RectangleF(r.X, r.Y, r.Width, r.Height)
End If

If CBool(e.State And DrawItemState.Selected) Then
e.Graphics.FillRectangle(ItemBrush, e.Bounds)
e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, b, r2, sf)

intOffsetLeft = 5
intOffsetTop = 5
Else
e.Graphics.DrawString(Me.TabPages(e.Index).Text, e.Font, b, r2, sf)
intOffsetLeft = 2
intOffsetTop = 2
End If

If Me.TabPages(e.Index).ImageIndex <> -1 Then
Me.ImageList.Draw(e.Graphics, _
Convert.ToInt32(r.Left) + intOffsetLeft, _
Convert.ToInt32(r.Top) + intOffsetTop, _
Me.TabPages(e.Index).ImageIndex)
End If
Catch ex As Exception
''The control is probably being disposed!!!
End Try
End Sub
End Class



Ahora, para usarlo, debe seguir estos simples pasos:

1. Añada un TabControl normal a su form al cual le agregará TabPages como hace normalmente.

2. Debe asegurarse de que su TabControl tiene la propiedad DrawMode puesta en OwnerDrawFixed. El mejor lugar para agregarla es en el evento Load de Form justo antes (o después) de la asignación del orden (order) del TabPage.
tabControl2.DrawMode = TabDrawMode.OwnerDrawFixed

Ahora está listo para deshabilitar el acceso a un TabPage. Para hacerlo, tan solo añada lo siguiente a su código:


TabControl2.DisablePage(TabPage6)
Area de Comentarios
Por Anónimo - Fecha: 2006/01/24 02:42 PM
Muy bueno el Truco, Pero y si quiero despues Habilitarlo como le hago???
Por Anónimo - Fecha: 2006/01/24 03:03 PM
El Problema es que no me Aparece el Nombre o Text en cada Pestaña, debido a la Propiedad = TabDrawMode.OwnerDrawFixed
como puedo solucionar esto?

ya arregle lo de Habilitarla:
Public Sub DisablePage(ByRef pTabPage As TabPage, ByVal Op As Integer)
If (Op = 0) Then
pTabPage.Enabled = False
Else
pTabPage.Enabled = True
End If
End Sub

Quizas seria bueno modificar el Codigo de Ejemplo para que este mas Robusta la Clase
Por royrojas - Fecha: 2006/08/17 10:50 AM
muchas gracias por el codigo, vamos a estar actualizando el articulo para que tenga este codigo.
Por Anónimo - Fecha: 2006/09/27 05:20 AM
Perfecto. La solución que da Micrisoft es una chapuza.
Por Rivervar - Fecha: 2006/10/26 08:12 PM
Esta muy bonito. Pero esto sirve para .NET Framework 1.x, como haria para el .net Framework 2.0 ya que muchos de los comandos en visual studio 2005 son diferentes a los de visual studio 2003
Por Anónimo - Fecha: 2006/12/12 05:30 PM
Como habilito los evento en tabcontrol?
Por Anónimo - Fecha: 2012/09/19 12:54 PM
Com puedo emigrarlo para que que funcione con el net framework 4???
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ibarra
dsevic
Eur
jota
juanjoguardiola
Víctor Carbajal
PER 237
MEX 236
CRI 185
COL 116
ESP 104
ARG 87