net example dinamicamente crear columnas asp asp.net data-binding gridview

asp.net - example - ¿Cómo se vincula una DropDownList en un GridView en el campo EditItemTemplate?



itemtemplate datafield (5)

Aquí está mi código en una vista de cuadrícula que está vinculada en tiempo de ejecución:

... <asp:templatefield> <edititemtemplate> <asp:dropdownlist runat="server" id="ddgvOpp" /> </edititemtemplate> <itemtemplate> <%# Eval("opponent.name") %> </itemtemplate> </asp:templatefield> ...

Quiero vincular la lista desplegable "ddgvOpp", pero no sé cómo. Debería, pero no lo hago. Esto es lo que tengo, pero sigo recibiendo un error de "referencia de objeto", que tiene sentido:

protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) //skip header row { DropDownList ddOpp = (DropDownList)e.Row.Cells[5].FindControl("ddgvOpp"); BindOpponentDD(ddOpp); } }

Donde BindOpponentDD() es justo donde se llena la DropDownList. ¿No estoy haciendo esto en el evento correcto? Si no, ¿en qué debo ponerlo?

Muchas gracias de antemano...


protected void grdDevelopment_RowDataBound(object sender, GridViewRowEventArgs e) { if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) { DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddlBuildServers"); } }

Prueba este

Esto te ayudará


Ok, creo que soy tonto. Me lo imaginé.

En el evento RowDataBound, simplemente agregue el siguiente condicional:

if (myGridView.EditIndex == e.Row.RowIndex) { //do work }


Tuve el mismo problema, pero esta solución (la de Jason, que está agregando el condicional al controlador) no funcionó para mí; la fila Editar nunca estuvo unida a datos, por lo que esa condición nunca se evaluó como verdadera. RowDataBound simplemente nunca se llamó con el mismo RowIndex que el GridView.EditIndex. Mi configuración es un poco diferente, sin embargo, en lugar de vincular el menú desplegable programáticamente, lo tengo vinculado a un ObjectDataSource en la página. Sin embargo, el menú desplegable aún debe vincularse por fila por separado, porque sus posibles valores dependen de otra información en la fila. Así que ObjectDataSource tiene un parámetro de sesión, y me aseguro de establecer la variable de sesión apropiada cuando sea necesario para el enlace.

<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName"> <SelectParameters> <asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" /> </SelectParameters>

Y el menú desplegable en la fila relevante:

<asp:TemplateField HeaderText="My Info" SortExpression="MyInfo"> <EditItemTemplate> <asp:DropDownList ID="ddlEditMyInfo" runat="server" DataSourceID="objInfo" DataTextField="MyInfo" DataValueField="MyInfoID" SelectedValue=''<%#Bind("ID") %>'' /> </EditItemTemplate> <ItemTemplate> <span><%#Eval("MyInfo") %></span> </ItemTemplate> </asp:TemplateField>

Lo que terminé haciendo no fue usar CommandField en GridView para generar mis botones de edición, eliminación, actualización y cancelación; Lo hice solo con un TemplateField, y al configurar los CommandNames adecuadamente, pude desencadenar las acciones integradas de edición / eliminación / actualización / cancelación en el GridView. Para el botón Editar, hice del CommandArgument la información que necesitaba para enlazar el menú desplegable, en lugar de la PK de la fila como solía ser. Esto afortunadamente no evitó que GridView editara la fila apropiada.

<asp:TemplateField> <ItemTemplate> <asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/delete.gif" AlternateText="Delete" CommandArgument=''<%#Eval("UniqueID") %>'' CommandName="Delete" /> <asp:ImageButton ID="ibtnEdit" runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandArgument=''<%#Eval("MyID") %>'' CommandName="Edit" /> </ItemTemplate> <EditItemTemplate> <asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/update.gif" AlternateText="Update" CommandArgument=''<%#Eval("UniqueID") %>'' CommandName="Update" /> <asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/cancel.gif" AlternateText="Cancel" CommandName="Cancel" /> </EditItemTemplate> </asp:TemplateField>

Y en el controlador RowCommand:

void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "Edit") Session["MID"] = Int32.Parse(e.CommandArgument.ToString()); }

El RowCommand, por supuesto, sucede antes de que la fila entre en modo de edición y, por lo tanto, antes de que el dato desplegable se vincule. Entonces todo funciona. Es un poco complicado, pero había pasado el tiempo suficiente tratando de descubrir por qué la fila de edición ya no estaba siendo databound.


Gracias a Saurabh Tripathi,

La solución que proporcionaste funcionó para mí. En el uso del evento gridView_RowDataBound ().

if(gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow) { // FindControl // And populate it }

Si alguien tiene el mismo problema, entonces intente esto.

Aclamaciones.


Este código hará lo que quieras:

<asp:TemplateField HeaderText="garantia" SortExpression="garantia"> <EditItemTemplate> <asp:DropDownList ID="ddgvOpp" runat="server" SelectedValue=''<%# Bind("opponent.name") %>''> <asp:ListItem Text="Si" Value="True"></asp:ListItem> <asp:ListItem Text="No" Value="False"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text=''<%# Bind("opponent.name") %>''></asp:Label> </ItemTemplate>