que tenía el mismo problema, pero esta revisión (Jason's, que está agregando el condicional al manejador) 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 correspondiente:
<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 estaba usando un CommandField en el GridView para generar mi editar, borrar, actualizar y cancelar los botones ; 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 la fila entra en el modo de edición y por lo tanto antes de que los databinds desplegables. 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.
Creo que también no es necesario (e.Row.RowType == DataControlRowType.DataRow) a menos que haya hackeado filas de encabezado editables en alguna manera. – quillbreaker
no lo haces porque comienza con la fila del encabezado y funciona hacia abajo. se obtiene un error si no lo hace, o simplemente no funciona. – Jason
O puede verificar si la fila está en el modo de edición con este 'if (e.RowState && DataControlRowState.Edit)> 0 {}' –