Foros del Web » Programando para Internet » ASPX (.net) »

Añadir controles de usuario en tiempo de ejecucion

Estas en el tema de Añadir controles de usuario en tiempo de ejecucion en el foro de ASPX (.net) en Foros del Web. Muy buenas a todos, se me a presentado un problemilla que no consigo solucionar... a ver si a alguien se le ocurre algo... Tengo un ...
  #1 (permalink)  
Antiguo 17/06/2010, 11:46
 
Fecha de Ingreso: junio-2010
Mensajes: 49
Antigüedad: 14 años, 6 meses
Puntos: 2
Añadir controles de usuario en tiempo de ejecucion

Muy buenas a todos, se me a presentado un problemilla que no consigo solucionar... a ver si a alguien se le ocurre algo...

Tengo un control de usuario que contiene el siguiente codigo html
Código:
<table width="100%">
<tr>
<td class="controlpermisot1">
Permiso:
</td>
<td class="controlpermisot2">
    <asp:TextBox ID="TxtPermiso" runat="server" Width="98%"></asp:TextBox>
</td>
<td class="controlpermisot3">
Descripcion:
</td>
<td>
    <asp:TextBox ID="TxtDescripcion" runat="server" Width="98%"></asp:TextBox>
</td>
<td class="controlpermisot1">
    <asp:Button ID="Modificar" runat="server" Text="Modificar" CssClass="botongeneral" />
</td>
</tr>

</table>
<asp:HiddenField ID="HdnPermiso" runat="server" />
<asp:HiddenField ID="HdnDescripcion" runat="server" />
y como CodeBehind tengo:

Código:
Imports Intranetdll
Public Class Permiso
    Inherits System.Web.UI.UserControl

    Private _permiso As String
    Private _descripcion As String


    ''' <summary>
    ''' Obtiene o establece la descripcion del permiso
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property permiso As String
        Get
            Return Me._permiso
        End Get
        Set(ByVal value As String)
            Me._permiso = value
        End Set
    End Property

    ''' <summary>
    ''' Obtiene o establece la descripcion del permiso
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property descripcion As String
        Get
            Return Me._descripcion
        End Get
        Set(ByVal value As String)
            Me._descripcion = value
        End Set
    End Property

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try

            Me.TxtPermiso.Text = Me.permiso
            Me.HdnPermiso.Value = Me.permiso
            Me.TxtDescripcion.Text = Me.descripcion
            Me.HdnDescripcion.Value = Me.descripcion
        Catch ex As Exception

        End Try


    End Sub

    ''' <summary>
    ''' Establece el texto que aparecerá en los controles
    ''' </summary>
    ''' <param name="permiso">El nombre con el que aparece el permiso</param>
    ''' <param name="descripcion">La descripción del permiso</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal permiso As String, ByVal descripcion As String)
        MyBase.New()
        Me.permiso = permiso
        Me.descripcion = descripcion
    End Sub

    Public Sub New()
        MyBase.New()
        Me.permiso = ""
        Me.descripcion = ""
    End Sub

    Protected Sub Modificar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Modificar.Click
        Dim opermiso As String = Me.HdnPermiso.Value
        Dim odescripcion As String = Me.HdnDescripcion.Value
        Dim npermiso As String = Me.TxtPermiso.Text
        Dim ndescripcion As String = Me.TxtDescripcion.Text
        Try
            Usuario.editfunction(ConfigurationManager.ConnectionStrings("SqlServices").ToString, opermiso, odescripcion, npermiso, ndescripcion)
            Me.HdnPermiso.Value = npermiso
            Me.HdnDescripcion.Value = ndescripcion
        Catch ex As Exception

        End Try
    End Sub
End Class
Luego, a la hora de añadirlo a la coleccion de controles del panel al que lo quiero destinar tengo:
Código:
        Dim ds As New DataSet
        Try
            ds = Usuario.getadminfunctions(Me.cn)
        Catch ex As Exception
            Me.lblError.Visible = True
        End Try


        For Each row As DataRow In ds.Tables("funciones").Rows
            Dim permiso As String = ""
            Dim descripcion As String = ""
            If row.Item("Description") IsNot Nothing Then
                permiso = row.Item("Description").ToString
            End If
            If row.Item("ExtendedDescription") IsNot Nothing Then
                descripcion = row.Item("ExtendedDescription").ToString
            End If
            Dim p As New Permiso(permiso, descripcion)

            
            Me.PanelAdministracion.Controls.Add(p)
            Dim txt As New TextBox
            Me.PanelAdministracion.Controls.Add(txt)
            Me.Label1.Text = Me.PanelAdministracion.Controls.Item(1).GetType.ToString



        Next
Ahora bien.... el ds de la funcion Usuario.getadminfunctions(Me.cn) se carga correctamente...
Al crear la instancia nueva de mi control de usuario... depurandolo compruebo como el sub new con parametros se ejecuta correctamente... y guardan su valor sin problemas.
El control se añade sin problemas tambien al panel ya que se ve en depuracion como su .count aumenta...
Creo el nuevo textbox... y lo añado a la coleccion del panel comprobando que tambien aumenta su .count.... y para mas inri, le tiro un gettype al control de usuario que añado y el label me saca el nombre de control correctamente.
Hata aqui todo correcto.... ahora...

Si dejo tal como está el sub load del control.... al ejecutarse:
Código:
 Me.TxtPermiso.Text = Me.permiso
me peta y me dice que necesito crear una instancia nueva... supongo que del textbox pero.... me.permiso contiene el valor correcto ¿Porque debo instanciar un nuevo textbox si está dentro del control y deberia tener acceso?

Si elimino el sub load, la aplicacion no peta pero.... se carga el textbox y no se carga mi control de usuario aunque el label me diga que es del tipo de mi control!!!!

¿Alguien sabria darme una explicación?

Muchas gracias de antemano y un saludo.

Etiquetas: añadir, controles, ejecucion, aspx, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:17.