Olá Amigos,
Às vezes precisamos criar um componente para suprir alguma necessidade particular, mesmo o Visual Studio vir com uma infinidade de componentes nativos, pode ser que não seja o suficiente para o que você precisa, já se deparou com um problema assim?
Muitos anos de programação, na maioria das vezes também é sinônimo de muitos componentes e classes próprias, no meu caso, tenho várias classes que reutilizo em meu programas muitas vezes, e a flexibilidade do .NET me permite usar essas classes tanto em aplicativos Windows como Web.
Os componentes podem ser baseados (herdados) de um componente já existente, gerando um outro componente com uma característica especial, por exemplo, para criar um TextBox que mude de cor quando recebe o foco, basta criar um componente herdado do TextBox e adicionar atributos nele, a declaração da classe seria a seguinte:
<DefaultProperty("Text"), ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")> _ Public Class WebCustomControl1 Inherits TextBox |
Mas e como criar um componente composto, baseado em vários componentes diferentes, como por exemplo, um TextBox com um RequiredFieldValidator?
É o que vou demonstrar aqui, como criar um CompositeControl:
Option Strict On Imports System Imports System.ComponentModel Imports System.Drawing Imports System.Security.Permissions Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Namespace AspNet.VB.Controls <DefaultProperty("Text"), ToolboxData("<{0}:TextBoxReq runat=server></{0}:TextBoxReq>")> _ Public Class TextBoxRequired Inherits CompositeControl Private ctrlTextBox As TextBox Private ctrlRequired As RequiredFieldValidator Private ctrlID As String <Category("Appearance"), DefaultValue("*"), Description("The Error Message")> _ Public Property ErrorMessage() As String Get EnsureChildControls() Return ctrlRequired.ErrorMessage End Get Set(ByVal value As String) EnsureChildControls() ctrlRequired.ErrorMessage = value End Set End Property <Category("Appearance"), Bindable(True)> _ Public Property Text() As String Get EnsureChildControls() Return ctrlTextBox.Text End Get Set(ByVal value As String) EnsureChildControls() ctrlTextBox.Text = value End Set End Property <Category("Default")> _ Public Overrides Property ID() As String Get Return ctrlID End Get Set(ByVal value As String) ctrlID = value End Set End Property <Category("Default")> _ Public Overrides Property Width() As System.Web.UI.WebControls.Unit Get Return ctrlTextBox.Width End Get Set(ByVal value As System.Web.UI.WebControls.Unit) ctrlTextBox.Width = value End Set End Property <Category("Default")> _ Public Property TextMode() As TextBoxMode Get Return ctrlTextBox.TextMode End Get Set(ByVal value As TextBoxMode) ctrlTextBox.TextMode = value End Set End Property <Category("Default")> _ Public Property Rows() As Integer Get Return ctrlTextBox.Rows End Get Set(ByVal value As Integer) ctrlTextBox.Rows = value End Set End Property Protected Overrides Sub CreateChildControls() Controls.Clear() ctrlTextBox = New TextBox ctrlTextBox.ID = ID ctrlTextBox.ValidationGroup = "dynControl" ctrlRequired = New RequiredFieldValidator ctrlRequired.ID = "Validator1" ctrlRequired.Font.Bold = True ctrlRequired.Font.Size = FontUnit.Large ctrlRequired.ControlToValidate = ctrlTextBox.ID ctrlRequired.Text = "" ctrlRequired.Display = ValidatorDisplay.Dynamic ctrlRequired.ValidationGroup = "dynControl" Me.Controls.Add(ctrlTextBox) Me.Controls.Add(ctrlRequired) End Sub Protected Overrides Sub RecreateChildControls() EnsureChildControls() End Sub End Class End Namespace |
Pra finalizar, um grande amigo meu, que sempre defendeu o PHP, motivo pelo qual temos discussões divertidíssimas quase diariamente, me disse uma vez que só iría falar bem do .NET o dia que pudesse programar PHP dentro do Visual Studio. Bem, esse dia chegou. Quem gosta muito do PHP e quer migrar pro .NET, ou já trabalhou com o PHP e quer usar esses conhecimentos criando sites em PHP.NET, dê uma olhada no link http://www.php-compiler.net
Me mandem e-mail: aguiar.fabio@gmail.com
Um grande abraço e muito sucesso