none
Como CONSTRUIR-CREAR un control asp Dinamicamente desde CodeBehind? RRS feed

  • Debate general

  • Hola.

    Reciban un cordial saludo.

    Tengo muy poca experiencia programando; pero se me encomendó investigar respecto a la posibilidad de crear un control ListView dinámicamente desde "CodeBehind"... es decir crear éste control desde el código de "VB" y desde ahí configurar sus atributos y propiedades; así como también tener control de los eventos.

    En otras ocasiones para algo simple como lo es un botón he hecho lo siguiente:

    - en el código VB

    Dim btnDinamico1 As Button = New Button()

    btnDinamico1.Text = "Botón Dinámico"

    btnDinamico1.OnClientClick = "return confirm('Evento ""Click"" En Cliente');"

    PlaceHolder1.Controls.Add(btnDinamico1)

     

    - en el código ASPX

    <body>

        <form id="form1" runat="server">

            <div>

                <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

            </div>

        </form>

    </body>

     

    Hasta aquí no tengo ningún problema; ya que para éste control si puedo alterar desde el código VB sus propiedades y atributos. Lo que me interesa es saber para el control LISTVIEW cómo hacerlo desde el CodeBehind construir su estructura, es decir tener manera de manipular éste código:

    <asp:listview

        id="lvDinamico"

        runat="server"

        insertitemposition="LastItem"

        onitemediting="lvDinamico_ItemEditing"

        onitemcanceling="lvDinamico_ItemCanceling"

        onitemupdating="lvDinamico_ItemUpdating"

        onitemdeleting="lvDinamico_ItemDeleting"

        oniteminserting="lvDinamico_ItemInserting"

        onpagepropertieschanging="lvDinamico_PagePropertiesChanging">

        <%-- Plantilla del contenedor del listview --%>

        <LayoutTemplate>

            <table id="itemPlaceholderContainer" runat="server" border="0">

                <tr runat="server">

                    <th runat="server"></th>

                    <th runat="server">ID</th>

                    <th runat="server">Descripción</th>

                </tr>

                <tr id="itemPlaceholder" runat="server">

                </tr>

            </table>

        </LayoutTemplate>

        <%-- Plantilla para las líneas de detalle del listview --%>

        <ItemTemplate>

            <tr>

                <td>

                    <asp:Button ID="DeleteButton"

                        runat="server"

                        CommandName="Delete"

                        Text="Eliminar"

                        OnClientClick="return confirm('¿Seguro que quiere eliminar el elemento?');" />

                    <asp:Button ID="EditButton"

                        runat="server"

                        CommandName="Edit"

                        Text="Editar"

                </td>

                <td>

                    <asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' />

                </td>

                <td>

                    <asp:Label ID="DescripcionLabel" runat="server" Text='<%# Eval("Descripcion") %>' />

                </td>

            </tr>

        </ItemTemplate>

    </asp:listview>


    Esto mismo para los demás Templates al igual que el DataPager; entonces la pregunta es ¿Cómo crear esto desde CodeBehind? Que NO exista éste código en el "ASPX" sino que se genere en tiempo de ejecución; por ejemplo en el evento "Init" o en el "Load". La intención es poder hacerlo lo más dinámico posible.

    Ojalá pudieran orientarme al respecto o si es que hay alguna manera mejor de hacerlo. De antemano agradezco su amable atención.

    viernes, 26 de mayo de 2017 18:02

Todas las respuestas

  • Esto es lo que he probado... pero no me ha fiuncionado:

    Protected WithEvents lvPuesto As New System.Web.UI.WebControls.ListView

    Dim sb As New StringBuilder

    Dim lt As New Literal

     

    sb.Append("<asp:ListView ID=""lvPuesto"" runat=""server"" InsertItemPosition=""LastItem"" OnItemEditing=""lvPuesto_ItemEditing"" OnItemCanceling=""lvPuesto_ItemCanceling"" OnItemUpdating=""lvPuesto_ItemUpdating"" OnItemDeleting=""lvPuesto_ItemDeleting"" OnItemInserting=""lvPuesto_ItemInserting"" OnPagePropertiesChanging=""lvPuesto_PagePropertiesChanging"">")

     

    sb.Append("<LayoutTemplate>")

    sb.Append("<table id=""itemPlaceholderContainer"" runat=""server"" border=""0"" class=""table table-hover table-bordered table-condensed"">")

    sb.Append("<tr runat=""server"">")

    sb.Append("<th background-color: #337ab7; color: white; width: 200px;"" runat=""server""></th>")

    sb.Append("<th background-color: #337ab7; color: white; width: 100px;"" runat=""server"">ID</th>")

    sb.Append("<th background-color: #337ab7; color: white;"" runat=""server"">Descripción</th>")

    sb.Append("<th background-color: #337ab7; color: white;"" runat=""server"">Critico</th>")

    sb.Append("<th background-color: #337ab7; color: white;"" runat=""server"">Planta</th>")

    sb.Append("<th background-color: #337ab7; color: white; width: 100px;"" runat=""server"">Eventual</th>")

    sb.Append("</tr>")

    sb.Append("<tr id=""itemPlaceholder"" runat=""server"">")

    sb.Append("</tr>")

    sb.Append("</table>")

    sb.Append("</LayoutTemplate>")

     

    sb.Append("<ItemTemplate>")

    sb.Append("<tr>")

    sb.Append("<td>")

    sb.Append("<asp:Button ID=""DeleteButton"" runat=""server"" CommandName=""Delete"" Text=""Eliminar"" CssClass=""btn btn-danger"" OnClientClick=""return confirm('¿Seguro que quiere eliminar el puesto?');"" />")

    sb.Append("<asp:Button ID=""EditButton"" runat=""server"" CommandName=""Edit"" Text=""Editar"" CssClass=""btn btn-info"" />")

    sb.Append("</td>")

    sb.Append("<td>")

    sb.Append("<asp:Label ID=""IDLabel"" runat=""server"" Text='<%# Eval(""ID"") %>' />")

    sb.Append("</td>")

    sb.Append("<td>")

    sb.Append("<asp:Label ID=""DescripcionLabel"" runat=""server"" Text='<%# Eval(""Descripcion"") %>' />")

    sb.Append("</td>")

    sb.Append("<td>")

    sb.Append("<asp:Label ID=""CriticoLabel"" runat=""server"" Text='<%# Eval(""Critico"") %>' />")

    sb.Append("</td>")

    sb.Append("<td>")

    sb.Append("<asp:Label ID=""PlantaLabel"" runat=""server"" Text='<%# Eval(""Planta"") %>' />")

    sb.Append("</td>")

    sb.Append("<td>")

    sb.Append("<asp:Label ID=""EventualLabel"" runat=""server"" Text='<%# Eval(""Eventual"") %>' />")

    sb.Append("</td>")

    sb.Append("</tr>")

    sb.Append("</ItemTemplate>")

     

    'Aquí el resto del código para los demás template

    '...

    '...

    '...

     

    'Hasta finalizar con la etiqueta de cierra del ListView

    sb.Append("</asp:ListView>")

     

    'Pasó el contenido del stringbuilder al control Literal

     

    lt.Text = sb.ToString()

     

    'Después añado el control Literal al PlaceHolder

    PlaceHolder1.Controls.Add(lt)

     

     

    lvPuesto.DataSource = 'Aquí tengo mi objeto DataSet con la tabla y sus datos que quiero mostrar (el problema no es hacer la conexión a la BD's ni la obtención de los datos)

    lvPuesto.DataBind() 'Se llena el control ListView con los datos obtenidos

     

    Error de servidor en la aplicación '/'.

    Debe definirse un ItemTemplate en ListView ''.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

     

    Detalles de la excepción: System.InvalidOperationException: Debe definirse un ItemTemplate en ListView ''.

    Ya he intentado colocando el código dentro de los eventos:

    Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        'Aquí en código donde se construye el ListView

        lvPuesto.DataSource = 'DataSet

        lvPuesto.DataBind()

    End Sub

     

    Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Load

        'Aquí en código donde se construye el ListView

        lvPuesto.DataSource = 'DataSet

        lvPuesto.DataBind()

    End Sub

     

    Private Sub Page_PreLoad(sender As Object, e As EventArgs) Handles Me.Load

        'Aquí en código donde se construye el ListView

        lvPuesto.DataSource = 'DataSet

        lvPuesto.DataBind()

    End Sub

    martes, 30 de mayo de 2017 19:02