miałem ten sam problem, ale ta poprawka (Jason, który dodaje warunkowy do obsługi) nie działa dla mnie; Wiersz Edit nigdy nie był databound, więc warunek nigdy nie był oceniany jako prawdziwy. RowDataBound po prostu nigdy nie był wywoływany z tym samym obiektem RowIndex co GridView.EditIndex. Moja konfiguracja jest trochę inna, ponieważ zamiast programować programowo listę rozwijaną, mam ją powiązaną z ObjectDataSource na stronie. Lista rozwijana wciąż musi być powiązana osobno dla każdego wiersza, ponieważ jej możliwe wartości zależą od innych informacji w wierszu. Dlatego obiekt ObjectDataSource ma parametr SessionParameter i upewniam się, że ustawię odpowiednią zmienną sesji, gdy będzie to potrzebne do powiązania.
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
A rozwijana w odpowiednim rzędzie:
<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>
Co skończyło się robi nie używał CommandField w GridView do generowania mój edytować, usuwać, aktualizować i Cancel ; Zrobiłem to sam z TemplateField, i ustawiając odpowiednio CommandNames, byłem w stanie wyzwolić wbudowane akcje edycji/usuwania/aktualizacji/anulowania w GridView. Dla przycisku Edytuj, zrobiłem CommandArgument informacje potrzebne do powiązania listy rozwijanej, zamiast wiersza PK, jak to zwykle bywa. To na szczęście nie przeszkodziło GridView w edycji odpowiedniego wiersza.
<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>
I obsługi RowCommand:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
RowCommand oczywiście zdarza się, zanim rząd przechodzi w tryb edycji, a więc przed databinds rozwijanej. Wszystko działa. To trochę hack, ale spędziłem wystarczająco dużo czasu próbując dowiedzieć się, dlaczego wiersz edycji nie był już databoundem.
Chyba też nie trzeba (e.Row.RowType == DataControlRowType.DataRow) chyba, że włamał się do edycji wierszy nagłówka w jakiś sposób. – quillbreaker
Nie robisz tego, ponieważ uruchamia się w wierszu nagłówka i idzie w dół. pojawi się błąd, jeśli tego nie zrobisz lub po prostu nie działa. – Jason
Lub możesz sprawdzić, czy wiersz jest w trybie edycji przez to 'if (e.RowState && DataControlRowState.Edit)> 0 {}' –