none
Usar un UserControl como DataSource de una GridView

    Pregunta

  • Hola a todos:

    tengo un User Control que está compuesto por una Label y una GridView.

    Necesito generar un reporte para todos los usuarios del sistema y eso implica mostrar un user control por cada usuario. Me dijeron que la mejor forma de hacerlo es poner una GridView en la página web del reporte y que en cada una de las Rows haya un TemplateField con el User Control como ItemTemplate, generando una instancia de este último por cada usuario del sistema.

    He intentado hacerlo sin éxito, primero creé una Lista tipada de UserControls, se la asigné al dataSource de la Grilla Principal y me daba un error de Instanciación de objetos y luego intenté castear los UserControls a ITemplate pero me da error de casteo.

     

    ¿¿Alguien puede orientarme sobre cuál es la mejor manera de usar un UserControl como DataSource de una GridView??

    Saludos para todos!

     


    Leonardo Guidi C# Developer Junior "Un experto es alguien temeroso de aprender algo nuevo, pues dejaría entonces de ser un experto" (Harry S. Truman)
    jueves, 01 de diciembre de 2011 14:13

Respuestas

  • Correcto.  Esa no es la forma de hacerlo.  Yo siempre trabajo con una capa de negocio, así que yo tendría una clase llamada algo así como Usuario que representaría un usuario.  Crearía una colección de tipo Usuario y la asignaría al DataSource del GridView.

    Ahora el GridView:

     

    <asp:GridView ID="gdv1" runat="server">
        <Columns>
            <asp:TemplateField HeaderText="Usuario">
                <custom:Micontrol ID="micUsuario" runat="server" MiPropiedad='<%# Eval("Alguna propiedad de la clase Usuario")%>'></custom:Micontrol>
            </asp:TemplateField>
    </asp:GridView>
    

    Algo así, diría yo.

     


    Jose R. MCP
    jueves, 01 de diciembre de 2011 14:24
  • Pues como le dije anteriormente, uno no asigna una colección de controles al DataSource.  Uno asigna una colección de datos o clases.

    public class Usuario
    {
        public String Nombre {get; set; }
        public bool Activo {get; set; }
    }
    
    public class ColeccionUsuario : List<Usuario>
    { }
    

    Entonces usted lee su fuente de datos (SQL Server?) y crea una colección de tipo ColeccionUsuario, y agrega un objeto Usuario por cada usuario en la base de datos.  Finalmente es esta colección la que asigna al DataSource del GridView, y puede vincular las propiedades de su UserControl a las propiedades de la clase Usuario.


    Jose R. MCP
    jueves, 01 de diciembre de 2011 14:44

Todas las respuestas

  • Correcto.  Esa no es la forma de hacerlo.  Yo siempre trabajo con una capa de negocio, así que yo tendría una clase llamada algo así como Usuario que representaría un usuario.  Crearía una colección de tipo Usuario y la asignaría al DataSource del GridView.

    Ahora el GridView:

     

    <asp:GridView ID="gdv1" runat="server">
        <Columns>
            <asp:TemplateField HeaderText="Usuario">
                <custom:Micontrol ID="micUsuario" runat="server" MiPropiedad='<%# Eval("Alguna propiedad de la clase Usuario")%>'></custom:Micontrol>
            </asp:TemplateField>
    </asp:GridView>
    

    Algo así, diría yo.

     


    Jose R. MCP
    jueves, 01 de diciembre de 2011 14:24
  • El tema es que esa parte la hice así

    Este es el código de mi grilla en la web del reporte:

     

    <asp:GridView ID="gvResult" runat="server" 
                                Width="100%" PagerSettings-Visible="False" PagerSettings-PageButtonCount="500" 
                                EmptyDataText="No records found" AutoGenerateColumns="False"
                                CellPadding="4" ForeColor="#333333" 
                                GridLines="None" AllowSorting="True" onsorting="gvResult_Sorting" 
                            DataSourceID="ObjectDataSource1">
                               <Columns>
                               <asp:TemplateField>
                                        <ItemTemplate>
                                        <uc2:EstimatedHoursByUser ID="EstimatedHoursByUser1" runat="server" />
                                        </ItemTemplate>
                                        </asp:TemplateField>
                                </Columns>
    


    Lo que me está dando error es la manera en la que debo asignarle esos user controls a la grilla ¿De que manerá debería hacerlo?

    Saludos


    Leonardo Guidi C# Developer Junior "Un experto es alguien temeroso de aprender algo nuevo, pues dejaría entonces de ser un experto" (Harry S. Truman)
    jueves, 01 de diciembre de 2011 14:33
  • Pues como le dije anteriormente, uno no asigna una colección de controles al DataSource.  Uno asigna una colección de datos o clases.

    public class Usuario
    {
        public String Nombre {get; set; }
        public bool Activo {get; set; }
    }
    
    public class ColeccionUsuario : List<Usuario>
    { }
    

    Entonces usted lee su fuente de datos (SQL Server?) y crea una colección de tipo ColeccionUsuario, y agrega un objeto Usuario por cada usuario en la base de datos.  Finalmente es esta colección la que asigna al DataSource del GridView, y puede vincular las propiedades de su UserControl a las propiedades de la clase Usuario.


    Jose R. MCP
    jueves, 01 de diciembre de 2011 14:44