У меня была та же проблема, но это исправление (Джейсона, добавляющее условие к обработчику) не сработало для меня; Строка редактирования никогда не была привязана к данным, поэтому это условие никогда не оценивалось как истинное. RowDataBound просто никогда не вызывался с тем же RowIndex, что и GridView.EditIndex. Однако моя установка немного отличается тем, что вместо программной привязки раскрывающегося списка я привязываю его к ObjectDataSource на странице. Тем не менее, выпадающее меню должно быть связано отдельно для каждой строки, потому что его возможные значения зависят от другой информации в строке. Таким образом, ObjectDataSource имеет SessionParameter, и я обязательно устанавливаю соответствующую переменную сеанса, когда это необходимо для привязки.
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
And the dropdown in the relevant row:
<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>
В итоге я не использовал CommandField в GridView для создания кнопок редактирования, удаления, обновления и отмены; Я сделал это самостоятельно с помощью TemplateField и, соответствующим образом установив CommandName, смог запустить встроенные действия редактирования/удаления/обновления/отмены в GridView. Для кнопки «Изменить» я сделал CommandArgument информацией, необходимой для привязки раскрывающегося списка, вместо PK строки, как это обычно бывает. К счастью, это не помешало GridView отредактировать соответствующую строку.
<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>
И в обработчике RowCommand:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
RowCommand, конечно, происходит до того, как строка перейдет в режим редактирования и, следовательно, до привязки данных в раскрывающемся списке. Так что все работает. Это немного хак, но я потратил достаточно времени, пытаясь понять, почему строка редактирования еще не привязана к данным.
person
Tom Hamming
schedule
26.01.2011