Cómo hacen para acceder al RowDatabound de un gridview anidado?
Nos ponemos a pensar un rato y… fuah!! ya sé!! Para esto, mostraremos el ejemplo de un gridview con un gridview anidado:
<asp:GridView ID="gridrisk_unit" Width="90%" runat="server" AutoGenerateColumns="False"
DataKeyNames="unitid" ShowHeader="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table id="tblControls" style="width: 100%;">
<tr>
<td class="shadow" style="width: 10%">
Unidad
</td>
<td>
<span style="font-weight: bold; float: left">
<%#Eval("title")%></span>
</td>
</tr>
<tr>
<td class="shadow">
Puestos
</td>
<td>
<asp:GridView ID="gridrisk_Position" Width="100%" runat="server" AutoGenerateColumns="False"
DataKeyNames="positionid" OnRowDataBound="gridrisk_Position_RowDataBound"
ShowHeader="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table style="width: 100%;">
<tr>
<td class="shadow" style="width: 10%">
Puesto
</td>
<td>
<span style="font-weight: bold; float: left">
<%#Eval("position")%></span>
</td>
</tr>
<tr>
<td class="shadow" style="width: 10%">
Funciones
</td>
<td>
<asp:Literal ID="ltFunctions" runat="server"></asp:Literal>
</td>
</tr>
<tr>
<td class="shadow" style="width: 10%">
Requisitos
</td>
<td>
<asp:Literal ID="ltRequisites" runat="server"></asp:Literal>
</td>
</tr>
<tr>
<td class="shadow" style="width: 10%">
Información adicional
</td>
<td>
<span style="font-weight: bold; float: left">
<%#Eval("additionalinfo")%></span>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Ahora, nos hacemos la pregunta: Cómo cargo el gridview anidado? Pues simple, usamos el evento RowDataBound del gridview contenedor, así:
Protected Sub gridrisk_unit_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridrisk_unit.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim uid As Integer = CInt(gridrisk_unit.DataKeys(e.Row.RowIndex).Value)
Dim dt As DataTable = risk_position.GetByrisk_unit(uid)
Dim gridrisk_Position As GridView = DirectCast(e.Row.FindControl("gridrisk_Position"), GridView)
gridrisk_Position.DataSource = dt
gridrisk_Position.DataBind()
End If
End Sub
De esa manera estamos cargando el gridview anidado, pero… la pregunta de fondo (y el motivo de este post) era: cómo accedo al rowdatabound del gridview anidado?
Pues de esta manera: el gridview anidado tiene declarado el RowdataBound así… OnRowDataBound="gridrisk_Position_RowDataBound" , esto me permite (como diría alguien) amarrarlo al gridview anidado, y luego en el código beside simplemente haría:
Protected Sub gridrisk_Position_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim pid As Integer = (DirectCast(sender, GridView)).DataKeys(e.Row.RowIndex).Value
Dim ltFunctions As Literal = DirectCast(e.Row.FindControl("ltFunctions"), Literal)
Dim dt As DataTable = risk_positionfunction.GetByrisk_position(pid)
ltFunctions.Text = dt.Rows(0)(risk_positionfunction.description)
Dim ltRequisites As Literal = DirectCast(e.Row.FindControl("ltRequisites"), Literal)
Dim dt0 As DataTable = risk_positionrequisite.GetByrisk_position(pid)
ltRequisites.Text = dt0.Rows(0)(risk_positionrequisite.description)
End If
End Sub
Como han podido ver, acceder al evento Rowdatabound del gridview anidado me permite manipular los controles de servidor que hubieran en ese gridview.
;)
1 comentario:
funciona muy bien
al principio no me funciono, no me habia dado cuenta que habia que agregar
OnRowDataBound="gridview2_RowDataBound" al Gridview, apenas lo agregue funciono muy bien
:) muchas gracias me alegraste el dia
Publicar un comentario