Ver Mensaje Individual
  #8 (permalink)  
Antiguo 18/11/2010, 02:19
Avatar de Bravenap
Bravenap
 
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: AdRotator con fechas de visualización

Bueno, por fin lo he solucionado. He cambiado radicalmente la lógica del funcionamiento del control personalizado y he hecho uso de base de datos y procedimientos almacenados en lugar de XML, aunque esto último, podría haber seguido siendo igual.

Primero el control, que en lugar de derivar de un AdRotator deriva de PlaceHolder, con un AdRotator como clase privada. No he hechos comentarios al código por lo que si alguien tiene alguna duda... que pregunte, por favor.

cpersAdRotatorFlash.vb
Código vb:
Ver original
  1. Imports System.ComponentModel
  2. Imports System.Data
  3. Imports System.Data.SqlClient
  4.  
  5. Namespace ControlesPersonalizados
  6.     ''' <summary>
  7.    ''' Control personalizado para soportar Flash y fechas de visualización en un control AdRotator.
  8.    ''' </summary>
  9.    ''' <remarks></remarks>
  10.    <DefaultProperty("Text"), _
  11. ToolboxData("<{0}:AdRotatorFlash runat=""server""></{0}:AdRotatorFlash>")> _
  12. Public Class AdRotatorFlash
  13.         Inherits System.Web.UI.WebControls.PlaceHolder
  14.  
  15.         Private _maxWidth As Unit
  16.         Private _keywordFilter As String
  17.         Public Property MaxWidth() As Unit
  18.             Get
  19.                 Return _maxWidth
  20.             End Get
  21.             Set(ByVal value As Unit)
  22.                 _maxWidth = value
  23.             End Set
  24.         End Property
  25.         Public Property KeywordFilter() As String
  26.             Get
  27.                 Return _keywordFilter
  28.             End Get
  29.             Set(ByVal value As String)
  30.                 _keywordFilter = value
  31.             End Set
  32.         End Property
  33.  
  34.         Private Class tmpAdRotator
  35.             Inherits AdRotator
  36.             Private _e As System.Web.UI.WebControls.AdCreatedEventArgs
  37.             Public ReadOnly Property EventArgs() As System.Web.UI.WebControls.AdCreatedEventArgs
  38.                 Get
  39.                     Return _e
  40.                 End Get
  41.             End Property
  42.  
  43.             Protected Overrides Sub OnAdCreated(ByVal e As System.Web.UI.WebControls.AdCreatedEventArgs)
  44.                 _e = e
  45.             End Sub
  46.  
  47.         End Class
  48.  
  49.         Private Function DTBanners(ByVal Keyword As String, Optional ByVal IsDefault As Boolean = False) As DataTable
  50.             Dim da As New SqlDataAdapter("PA_Anuncios", conSQL)
  51.             da.SelectCommand.CommandType = CommandType.StoredProcedure
  52.             da.SelectCommand.Parameters.AddWithValue("@keyword", Keyword)
  53.             da.SelectCommand.Parameters.AddWithValue("@isDefault", IsDefault.GetHashCode)
  54.             Dim dt As New DataTable
  55.             da.Fill(dt)
  56.             If dt.Rows.Count = 0 And IsDefault Then
  57.                 dt = DTBanners(Keyword, True)
  58.             End If
  59.             Return dt
  60.         End Function
  61.  
  62.         Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
  63.             Dim ar As New tmpAdRotator()
  64.             Dim dt As DataTable = DTBanners(KeywordFilter)
  65.             If dt.Rows.Count <> 0 Then
  66.                 ar.DataSource = dt
  67.                 ar.DataBind()
  68.                 ar.Target = "_blank"
  69.                 Me.Controls.Add(ar)
  70.                 Dim Height As Unit = CInt(ar.EventArgs.AdProperties("Height"))
  71.                 Dim Width As Unit = CInt(ar.EventArgs.AdProperties("Width"))
  72.                 If MaxWidth.ToString <> "" Then
  73.                     If ar.EventArgs.AdProperties("Width") > MaxWidth.Value Then
  74.                         Height = (MaxWidth.Value * Height.Value / Width.Value) - 5
  75.                         Width = MaxWidth
  76.                     End If
  77.                 End If
  78.                 ar.Target = _
  79.                     IIf(String.Format("{0}", ar.EventArgs.AdProperties("Target")) <> "", _
  80.                     ar.EventArgs.AdProperties("Target"), "_blank")
  81.                 If ar.EventArgs.ImageUrl.ToLower.IndexOf(".swf") <> -1 Then
  82.                     Dim StringFormat As StringBuilder = New StringBuilder("")
  83.                     StringFormat.Append("<object type='application/x-shockwave-flash' data='{2}' width='{0}' height='{1}'>")
  84.                     StringFormat.Append("<param name='movie' value='{2}' />")
  85.                     StringFormat.Append("<img src='{2}' width='{0}' height='{1}' alt='Publicidad' />")
  86.                     StringFormat.Append("</object>")
  87.                     Dim OutPutString As StringBuilder = New StringBuilder()
  88.                     OutPutString.AppendFormat(StringFormat.ToString, _
  89.                         Width, _
  90.                         Height, _
  91.                         ResolveUrl(ar.EventArgs.ImageUrl))
  92.                     writer.Write(OutPutString.ToString)
  93.                 Else
  94.                     Me.Controls.Clear()
  95.                     ar.Width = Width
  96.                     ar.Height = Height
  97.                     Me.Controls.Add(ar)
  98.                     MyBase.Render(writer)
  99.                 End If
  100.             End If
  101.         End Sub
  102.  
  103.     End Class
  104. End Namespace
Estructura de la tabla en SQL Server, "tblAnuncios":
Código TXT:
Ver original
  1. 3   ID  int 4   0  
  2. 0   ImageUrl    nvarchar    400 0  
  3. 0   NavigateUrl nvarchar    400 0  
  4. 0   AlternateText   nvarchar    400 1  
  5. 0   Keyword nvarchar    125 1  
  6. 0   Impressions int 4   1  
  7. 0   Width   int 4   1  
  8. 0   Height  int 4   1  
  9. 0   StartDate   smalldatetime   4   1  
  10. 0   EndDate smalldatetime   4   1  
  11. 0   Target  nvarchar    50  1  
  12. 0   IsDefault   bit 1   0
Procedimiento almacenado en SQL Server, "PA_Anuncios":
Código SQL:
Ver original
  1. ALTER PROCEDURE PA_Anuncios
  2. (
  3.     @keyword nvarchar(125),
  4.     @isDefault bit = 0
  5. )
  6. AS
  7. BEGIN
  8.     SELECT * FROM tblAnuncios
  9.     WHERE
  10.         Keyword = @keyword
  11.         AND
  12.         ISNULL(StartDate,0) <= CASE WHEN StartDate IS NULL THEN ISNULL(StartDate,0) ELSE GETDATE() END
  13.         AND
  14.         ISNULL(EndDate,0) >= CASE WHEN EndDate IS NULL THEN ISNULL(EndDate,0) ELSE DATEADD(DAY,-1, GETDATE()) END
  15.         AND
  16.         IsDefault = @isDefault
  17. END
Y finalmente, la inserción del control en el HTML:
Código HTML:
Ver original
  1. <ControlesPersonalizados:AdRotatorFlash ID="AdRotatorFlash1" runat="server" KeywordFilter="rotatorioMenu" MaxWidth="190" />
¿Pegas y/o sugerencias?

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!