Este fue uno de los problemas que me encontré en la elaboración de mi primera aplicación web para mi empresa, que luego acabo convirtiendose en mi proyecto de final de carrera (EITS/FIB).
En la universidad habiamos realizado aplicaciones 3capas, pero ninguna de ellas era web! Por ello realice un pequeño estudio, por diferentes webs y otros proyectos hasta que acabe con una idea exacta de como subdividir las capas, y lo más importantes, como implementarlas.
Antes de continuar, hago un pequeño recordatorio de la arquitectura 3capas:
CAPA PRESENTACIÓN (Pantallas)
CAPA DOMINIO (Lógica de Negocio)
CAPA DATOS (Datos, normalmente con una BD abajo del todo que es la que los guarda físicamente)
Cada una de estas sólo se puede comunicar con la colindante.
La traducción de la Capa de Dominio y de Presentación, no tiene excesiva diferencia a una aplicación no web, el problema lo encontramos en la capa de datos.
Problema:Si hiciesemos una traducción directa, todo set o get, iria a buscar la información a la BD, aumentando de forma exagerada el número de conexiones y consultas a la BD, por lo tanto, si optimizar y sacar el rendimiento necesario a esta.
Solución:Traducir todos los métodos de las clases de la capa de datos, a métodos estáticos a los cuales se le hará llegar el identificador de la clase.
Ejemplo:
3 Capas:
Clase Coche (Matricula: string, Propietario: string)
new()
setMatricula(...) getMatricula()..
setPropietario(...) getPropiertario()...
static cochesPropietario(...)...
3 Capas Web:
Clase Coche ()
nuevoCoche(..)... ->similiar al new
borrarCoche(...)... -> similiar al dispose
modificarCoche(...)... -> similiar al set
datosCoche(...).... -> similiar al get
listarCoche(...)... -> static que se implementaria en la capa de domimio
Espero que os sea de ayuda en vuestras futuras aplicaciones web, sobretodo si estais empezando como me paso a mi en su dia.
Ejemplo 3 capas .net
sábado, septiembre 23, 2006
sábado, septiembre 16, 2006
Deshabilitar TabPag en VB.NET

Hola a todos, un problema que seguro que os encontrareis en cuanto os pongais a utilizar los Tabular Panels (Tab Panes) es que estos, si se deshabilitan no producen el resultado esperado. Son accesibles, y lo que hace, es inhabilitar el contenido de este. Para tener el resultado esperado, acontinuación os adjunto la clase del nuevo componente:
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 System.Drawing.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 = System.Windows.Forms.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 = System.Windows.Forms.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 System.Windows.Forms.TabPage)
pTabPage.Enabled = False
End Sub
Public Sub EnablePage(ByRef pTabPage As System.Windows.Forms.TabPage)
pTabPage.Enabled = True
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 System.Drawing.RectangleF = System.Drawing.RectangleF.op_Implicit(e.Bounds)
Dim r2 As System.Drawing.RectangleF
Dim ItemBrush As New System.Drawing.SolidBrush(Me.BackColor)
Dim b As System.Drawing.Brush
If Me.TabPages(e.Index).Enabled Then
b = System.Drawing.Brushes.Black
Else
b = System.Drawing.Brushes.Gray
End If
Dim sf As New System.Drawing.StringFormat
sf.Alignment = System.Drawing.StringAlignment.Center
sf.LineAlignment = System.Drawing.StringAlignment.Center
Dim im As System.Drawing.Bitmap
If Me.TabPages(e.Index).ImageIndex <> -1 Then
im = CType(Me.ImageList.Images(Me.TabPages(e.Index).ImageIndex), System.Drawing.Bitmap)
End If
If Me.TabPages(e.Index).ImageIndex <> -1 Then
r2 = New System.Drawing.RectangleF(r.X + (im.Width \ 2), r.Y, r.Width, r.Height)
Else
r2 = New System.Drawing.RectangleF(r.X, r.Y, r.Width, r.Height)
End If
If CBool(e.State And System.Windows.Forms.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
Para la utilización, debereis incorporar este al menú de Visual Studio, importar la dll generada, que os recuerdo que estara en el directorio /bin del proyecto donde habeis incorporado la clase, y alejop. Ya lo teneis, TabPagEx!!Ahora, en las propiedades, debereis poner
Me.TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed Me.TabControl1.DisablePage(Me.TabPage2)
Suscribirse a:
Entradas (Atom)
