我也遇到了同样的问题,但是这个解决方法(Jason的方法,即在处理程序中添加条件)对我没有起作用;编辑行从未被数据绑定,因此该条件从未评估为真。RowDataBound根本没有以与GridView.EditIndex相同的RowIndex调用。我的设置有点不同,因为我没有以编程方式绑定下拉列表,而是将其绑定到页面上的ObjectDataSource。然而,下拉列表仍然必须针对每一行单独进行绑定,因为它的可能值取决于行中的其他信息。因此,ObjectDataSource具有SessionParameter,并且我确保在需要绑定时设置适当的会话变量。
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
以及相关行中的下拉菜单:
<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>
我最终所做的不是使用GridView中的CommandField生成编辑、删除、更新和取消按钮;而是用TemplateField自己实现,并通过适当设置CommandNames来触发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事件发生在行进入编辑模式之前,因此在下拉列表数据绑定之前。所以一切正常。这有点像是一个hack,但我已经花了足够的时间来尝试弄清楚为什么编辑行还没有被数据绑定。
if(e.RowState && DataControlRowState.Edit) > 0 {}
- Emad Mokhtar