martes, 1 de diciembre de 2009

ASP.NET – Acceder a evento RowDataBound de gridview anidado

nested_gridview 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:

Unknown dijo...

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