J'ai eu le même problème, mais ce correctif (Jason, qui ajoute le conditionnel au gestionnaire) n'a pas fonctionné pour moi; la ligne Edit n'a jamais été databound, donc cette condition n'a jamais été évaluée à true. RowDataBound n'a tout simplement jamais été appelé avec le même RowIndex que GridView.EditIndex. Ma configuration est un peu différente, cependant, au lieu de lier par programmation la liste déroulante je l'ai lié à un ObjectDataSource sur la page. La liste déroulante doit toujours être liée séparément par ligne, car ses valeurs possibles dépendent des autres informations de la ligne. Donc l'objet ObjectDataSource a un SessionParameter, et je m'assure de définir la variable de session appropriée quand nécessaire pour la liaison.
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
Et le menu déroulant dans la ligne correspondante:
<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>
Ce que je fini par faire était de ne pas utiliser un CommandField dans le GridView pour générer mon éditer, supprimer, mettre à jour et annuler boutons ; Je l'ai fait moi-même avec un TemplateField, et en définissant les CommandNames de manière appropriée, j'ai été capable de déclencher les actions intégrées edit/delete/update/cancel sur le GridView. Pour le bouton Modifier, j'ai fait à CommandArgument les informations dont j'avais besoin pour lier le menu déroulant, au lieu du PK de la ligne comme il le ferait habituellement. Cela n'a heureusement pas empêché GridView de modifier la ligne appropriée.
<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>
Et dans le gestionnaire RowCommand:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
Le RowCommand, bien sûr, se produit avant que la ligne passe en mode d'édition et donc avant les databinds déroulantes. Donc tout fonctionne. C'est un peu un hack, mais j'avais passé assez de temps à essayer de comprendre pourquoi la ligne d'édition n'était pas déjà databound.
Je pense que vous aussi ne pas besoin (e.Row.RowType == DataControlRowType.DataRow), sauf si vous avez piraté des lignes d'en-tête modifiables en quelque sorte. – quillbreaker
non parce que cela commence avec la ligne d'en-tête et descend vers le bas. vous obtenez une erreur si vous ne le faites pas, ou cela ne fonctionne tout simplement pas. – Jason
Ou vous pouvez vérifier si la ligne est en mode d'édition par ce 'if (e.RowState && DataControlRowState.Edit)> 0 {}' –