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 Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles 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 Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles 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.PageIndexChanged, AddressOf 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 Object, ByVal 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.....