Foros del Web » Programación para mayores de 30 ;) » .NET »

DataGrid dentro de un Datalist

Estas en el tema de DataGrid dentro de un Datalist en el foro de .NET en Foros del Web. Bueno la pregunta es si es posible tener un DataGri dentro de un Datalist. Vi un ejemplo en C que lo hacia, pero con VB ...
  #1 (permalink)  
Antiguo 19/04/2004, 17:50
Avatar de martinArgentino  
Fecha de Ingreso: diciembre-2002
Mensajes: 157
Antigüedad: 21 años, 4 meses
Puntos: 1
DataGrid dentro de un Datalist

Bueno la pregunta es si es posible tener un DataGri dentro de un Datalist.

Vi un ejemplo en C que lo hacia, pero con VB no me permite acceder al DataGrid que esta dentro del DaltaList


Este es el codigo HTML



<asp:datalist id="dlDuplicatesP" runat="server" width="650" cellspacing="0" cellpadding="0">
<ItemTemplate>
<TABLE class="blueborder" id="Table5" cellSpacing="0" cellPadding="0" width="650" border="0">
<TR>
<TD class="bluetitle" align="middle" colSpan="6">Company</TD>
</TR>
<TR vAlign="top" align="middle">
<TD>
<asp:Label id=CompanyId1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CompanyId1") %>'>
</asp:Label></TD>
<TD colSpan="6">
<asp:Label id=CompanyName runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.CompanyName") %>'>
</asp:Label></TD>
</TR>
<TR>
<TD class="bluetitle" align="middle" colSpan="7">This is an Excel file Person</TD>
</TR>
<TR vAlign="top">
<TD>ID:<BR>
-</TD>
<TD>Last Name:<BR>
<asp:Label id=NewLastName runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.NewLastName") %>'>
</asp:Label></TD>
<TD>First Name:<BR>
<asp:Label id=NewFirstName runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.NewFirstName") %>'>
</asp:Label></TD>
<TD>Title:<BR>
<asp:Label id=NewTitle runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.NewTitle") %>'>
</asp:Label></TD>
<TD>Work Phone:<BR>
<asp:Label id=NewPhoneWork runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.NewPhoneWork") %>'>
</asp:Label></TD>
<TD>Work Email:<BR>
<asp:Label id=NewWorkEmail runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.NewWorkEmail") %>'>
</asp:Label></TD>
<TD align="middle">
<asp:CheckBox id="check1" runat="server"></asp:CheckBox></TD>
</TR>
<TR>
<TD colSpan="7">
<asp:DataGrid id="dgPersonBD" runat="server" AutoGenerateColumns="False" DataKeyField="PersonId" ShowHeader="False" GridLines="None">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Label runat="server" ID=lblPersonId Text='<%# DataBinder.Eval(Container, "DataItem.PersonId") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Label ID=lblLastName runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.LastName") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid></TD>
</TR>
</TABLE>
</ItemTemplate>
</asp:datalist>



Bueno, una vez que lleno los campos del Datalist asigno el Dataset Correspondiente y ejecuto el databind o sea

dlDuplicatesC.DataSource = DsCT
dlDuplicatesC.DataBind()


Me voy al evento ItemDataBound que segun entiendo es el que se ejecuta al hacer DataBind.

Este es el codigo

Private Sub dlDuplicatesP_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles dlDuplicatesP.ItemDataBound
Dim item As DataListItem
Dim oPerson As New Persons()
Dim lastname As String
Dim firstname As String
Dim dsP As New DataSet()
For Each item In dlDuplicatesP.Items
lastname = CStr(CType(item.FindControl("newLastName"), Label).Text)
firstname = CStr(CType(item.FindControl("newFirstName"), Label).Text)
dsP = oPerson.GetPersonSearch(lastname, firstname)
dgPersonBD.dataSource = dsP
dgPersonBD.databind()
Next
dsP = Nothing
End Sub


Bueno es aqui en donde se clava
dgPersonBD.dataSource = dsP



Me dice

Object reference not set to an instance of an object.


Al Control DataGrid lo tuve que declarar a mano ya que al meter un objeto dentro de otro (ASP:datagrid en ASP:datalist ) no lo creaba. Al compilar no me da ningun error.


Bueno espero haber sido claro y que alguien me pueda ayudar o pasar un ejemplo donde exista un DataGid Dentro de Un Datalist, y si no es mucho pedir en VB ya que tengo uno en C y haciendo lo mismo no puedo lograr que funcione

Saludos
__________________
Martin
  #2 (permalink)  
Antiguo 22/04/2004, 17:45
 
Fecha de Ingreso: junio-2001
Ubicación: Cordoba, Argentina
Mensajes: 190
Antigüedad: 22 años, 11 meses
Puntos: 0
Hola, el problema que tenes es que al agregar un control a una plantilla de un control basado en plantillas(como el datalist), el control dentro de la plantilla no existe, ya que estas creando una plantilla y no un control.
Al crear una plantilla le indicas al datalist que para cada fila cree dinamicamente una datagrid. El control(es) datagrid se generan dinamicamente y es agregado como un control dentro de la coleccion controls de datalistitem.

Lo de agregar a mano el control, no sirve, porque como dije antes el control no existe, lo que en realidad estas haciendo es crear un control en el code behind sin un tag en aspx.

Para acceder al control, debes usar el evento itemdatabound, lo unico que tenes que hacer es buscarlo en la coleccion en itemactual
ej:
Código PHP:
  Private Sub DataList1_ItemDataBound(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.DataListItemEventArgsHandles DataList1.ItemDataBound


        
If e.Item.ItemIndex <> -1 Then
            Dim dg 
As DataGrid
            dg 
CType(e.Item.FindControl("MyDataGrid"), DataGrid)
            If 
Not dg Is Nothing Then
                
'codigo parar el datagrid encontrado'

            
End If
        
End If
    
End Sub 
Otro tema son los eventos. Debido a que hay varios controles generados dinamicamente(varios datagrid) estos no tienen asociado los eventos con handlers(como seria un control tirado desde la barra de herramientas).
Al disparar cualquier evento de algun datagrid (Ej:pageindexchanged), se ejecuta el evento itemcommand del datalist ya que es el contenedor.
Una solucion para esto es asociar los eventos del datagrid cuando este es creado, asociarlo dinamicamente(ya que el control es creado dinamicamente), para eso tenes que escribir un protipo de funcion delegado para el evento que queres implementar fuera del itemcommand del datalist y asociar dinamicamente ese datagrid con la funcion manejadora del evento(en el ejemplo se maneja fuera del datalist el evento pageindexchanged de los datagrid).
Ej:
Código PHP:
'AQUI SE ASOCIA EL EVENTO AL DATAGRID PARA CADA DATAGRID CREADO'
Private Sub DataList1_ItemCreated(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.DataListItemEventArgsHandles DataList1.ItemCreated
        
If e.Item.ItemIndex <> -1 Then
            Dim dg 
As DataGrid
            dg 
CType(e.Item.FindControl("MyDataGrid"), DataGrid)
            If 
Not dg Is Nothing Then
                
'AGREGAR EVENTO DINAMICAMENTE PARA LOS DATAGRID'
                
AddHandler dg.PageIndexChangedAddressOf UnDataGrid_PageIndexChanged
            End 
If
        
End If
    
End Sub
'FUNCION QUE CAPTURA EL EVENTO , BASADO EN EL PROTOTIPO DELEGADO '
    
Private Sub UnDataGrid_PageIndexChanged(ByVal source As ObjectByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs)
        
'HANDLER PARA TODOS LOS DATAGRID DENTRO DEL DATALIST'

    
End Sub 
Bueno, eso es todo, espero que te sirva.....
__________________
Martin
  #3 (permalink)  
Antiguo 23/04/2004, 08:03
Avatar de martinArgentino  
Fecha de Ingreso: diciembre-2002
Mensajes: 157
Antigüedad: 21 años, 4 meses
Puntos: 1
Ta Gueno

Muchas gracias.

Me sirvió lo que me pasaste.

Saludos
__________________
Martin
  #4 (permalink)  
Antiguo 08/02/2005, 05:39
 
Fecha de Ingreso: septiembre-2004
Mensajes: 24
Antigüedad: 19 años, 7 meses
Puntos: 0
Hola,
En mi caso estoy haciendo un datalist2 dentro de datalist1, hasta aqui con el codigo que comentasteis arriba m'he funciona pefectamente, el problema lo tengo con los eventos de los controles que tengo dentro del datalist2, por ejemplo los linkbuttons que genera cada iteracion. El caso es que el Handler no me acaba de funcionar:

mi codigo es:
ASPX::
Código HTML:
<asp:datalist id="dlSeries" Runat="server" RepeatDirection="Vertical">

  <ItemTemplate>
    <asp:LinkButton ID="lbserie" CommandName='Serie' CommandArgument='<%# Container.DataItem("codi_serie")%>' Runat="server"><%# Container.DataItem("nom")%></asp:LinkButton>
  </ItemTemplate>

  <SelectedItemTemplate>
    <asp:Label ID="lserie" Runat="server" BORDERStyle="none"><%# Container.DataItem("nom")%></asp:Label>

    <asp:datalist id="dlSerieMenu" Runat="server" RepeatDirection="Vertical">
      <ItemTemplate>
        <asp:LinkButton ID="lbSerieMenu" CommandName='SerieMenu' CommandArgument='<%# Container.DataItem("url_" & Session("idioma"))%>' Runat="server" BORDERStyle="none"><%# Container.DataItem("titol_" & Session("idioma"))%></asp:LinkButton>
      </ItemTemplate>
      <SelectedItemTemplate>
        <asp:Label ID="lSerieMenu" Runat="server" BORDERStyle="none"><%# Container.DataItem("titol_" & Session("idioma"))%></asp:Label>
      </SelectedItemTemplate>
    </asp:DataList>

  </SelectedItemTemplate>

</asp:datalist> 
VB::
Código:
 'FUNCION QUE AMPLIA LA SERIE SELECCIONADA
    Private Sub Ampliar_Serie(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
        dlSeries.DataSource = dvSeries
        dlSeries.SelectedIndex = e.CommandArgument - 1
        dlSeries.DataBind()
        dlSeries.RepeatLayout = RepeatLayout.Table
    End Sub
    'FUNCION QUE MUESTRA EL MENU DE LA PRUEBA SELECCIONADA
    Private Sub Ampliar_Serie_Menu(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
        If e.Item.ItemIndex <> -1 Then
            Dim dlSerieMenu As DataList
            dlSerieMenu = CType(e.Item.FindControl("dlSerieMenu"), DataList)
            If Not dlSerieMenu Is Nothing Then
                'codi per al datalist anidat
                dvSerieMenu.RowFilter = "f_codi_serie =" & e.Item.ItemIndex + 1
                dlSerieMenu.DataSource = dvSerieMenu
                'dlSerieMenu.SelectedIndex = e.CommandName - 1
                dlSerieMenu.DataBind()
                dlSerieMenu.RepeatLayout = RepeatLayout.Table
            End If
        End If
    End Sub
    Private Sub dlSerie_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles dlSeries.ItemCreated
        If e.Item.ItemIndex <> -1 Then
            Dim dlSerieMenu As DataList
            dlSerieMenu = CType(e.Item.FindControl("dlSerieMenu"), DataList)
            If Not dlSerieMenu Is Nothing Then
                AddHandler dlSerieMenu.ItemCommand, AddressOf Obrir_SerieMenu
            End If
        End If
    End Sub
    Private Sub Obrir_SerieMenu(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs)
        Dim Arxiu As System.IO.StreamReader
        Dim liniaText As String
        Dim ruta_prova As String
        'Fem un Checking del arxiu que volem carregar pq en cas que no existeixi no peti
        ruta_prova = ruta_server & "\bd\series\AR1\textos\maininfo_catala.html"
        If Not File.Exists(ruta_prova) Then
            Arxiu = File.OpenText(ruta_server & "\bd\error" & Session("idioma") & ".html")
        Else
            Arxiu = File.OpenText(ruta_server & "\bd\series\AR1\textos\maininfo_catala.html")
            'Arxiu = File.OpenText(ruta_server & "\" & e.CommandArgument)
        End If
        Do
            liniaText = Arxiu.ReadLine()
            SerieMenu_text = SerieMenu_text & liniaText
        Loop Until liniaText Is Nothing
        Arxiu.Close()
        'SerieMenu_text = "holaccccccccccccc"
    End Sub

El problema esta en la ultima funcion que controla los eventos que ocurren dentro del datalist interior.

Si alguien puede hecharme un cable...
Gracias
__________________
van rage
"If you don't, don't"
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 01:02.