Ich hatte das gleiche Problem helfen, aber dieses Update (Jasons, der dem Handler die Bedingung hinzufügt) funktionierte nicht für mich; Die Zeile "Bearbeiten" wurde nie mit Daten verknüpft, sodass diese Bedingung nie als "wahr" bewertet wurde. RowDataBound wurde einfach nie mit demselben RowIndex wie der GridView.EditIndex aufgerufen. Mein Setup ist ein wenig anders, da ich das Dropdown-Programm nicht programmatisch an eine ObjectDataSource auf der Seite gebunden habe. Das Dropdown muss jedoch immer noch separat pro Zeile gebunden werden, da seine möglichen Werte von anderen Informationen in der Zeile abhängen. Also hat die ObjectDataSource einen SessionParameter, und ich stelle sicher, dass die passende Session-Variable gesetzt wird, wenn sie zum Binden benötigt wird.
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
Und das Drop-Down in der entsprechenden Zeile:
<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>
Was ich am Ende tun war kein Command im Gridview mit meinem bearbeiten zu erzeugen, löschen, aktualisieren und Abbrechen Schaltflächen ; Ich habe es selbst mit einem TemplateField gemacht und durch entsprechende Einstellung der CommandNames konnte ich die integrierten Edit/Delete/Update/Cancel Aktionen auf dem GridView auslösen. Für die Schaltfläche "Bearbeiten" habe ich CommandArgument die Informationen erstellt, die ich zum Binden der Dropdown-Liste benötigte, anstelle der PK der Zeile, wie es normalerweise der Fall wäre. Dies verhinderte glücklicherweise nicht, dass GridView die entsprechende Zeile editierte.
<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>
Und in dem RowCommand Handler:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
Der RowCommand, natürlich geschieht, bevor die Zeile in Modus bearbeiten geht und somit vor dem Drop-Down-databinds. So funktioniert alles. Es ist ein bisschen wie ein Hack, aber ich hatte genug Zeit damit verbracht herauszufinden, warum die Editierzeile nicht bereits datengebunden war.
Ich glaube, Sie brauchen auch nicht (e.Row.RowType == DataControlRowType.DataRow), wenn Sie editierbare Kopfzeilen in irgendwie gehackt haben. – quillbreaker
Nein, weil es beginnt mit der Kopfzeile und arbeitet sich nach unten. Sie erhalten einen Fehler, wenn Sie dies nicht tun, oder es funktioniert einfach nicht. – Jason
Oder Sie können überprüfen, ob sich die Zeile im Bearbeitungsmodus befindet, indem Sie 'if (e.RowState && DataControlRowState.Edit)> 0 {} ' –