tôi đã cùng một vấn đề, nhưng sửa chữa này (Jason's, bổ sung thêm điều kiện cho người xử lý) không làm việc cho tôi; hàng Edit không bao giờ được databound, do đó điều kiện không bao giờ được đánh giá là true. RowDataBound chỉ đơn giản là không bao giờ được gọi với cùng RowIndex như GridView.EditIndex. Mặc dù vậy, thiết lập của tôi hơi khác một chút, thay vì ràng buộc trình đơn thả xuống theo chương trình, tôi đã gắn nó với một ObjectDataSource trên trang. Tuy nhiên, trình đơn thả xuống vẫn phải được ràng buộc riêng biệt trên mỗi hàng vì các giá trị có thể của nó phụ thuộc vào các thông tin khác trong hàng. Vì vậy, ObjectDataSource có một SessionParameter, và tôi chắc chắn để thiết lập biến phiên thích hợp khi cần thiết để ràng buộc.
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
Và thả xuống ở hàng liên quan:
<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>
Những gì tôi đã kết thúc làm đã không sử dụng một CommandField trong GridView để tạo chỉnh sửa của tôi, xóa, cập nhật và hủy bỏ các nút ; Tôi đã làm nó một mình với một TemplateField, và bằng cách thiết lập các CommandNames một cách thích hợp, tôi đã có thể kích hoạt các hành động chỉnh sửa/xóa/cập nhật/hủy tích hợp sẵn trên GridView. Đối với nút Edit, tôi đã tạo CommandArgument thông tin cần thiết để liên kết dropdown, thay vì PK của hàng như thường lệ. Điều này may mắn đã không ngăn GridView chỉnh sửa hàng thích hợp.
<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>
Và trong xử lý RowCommand:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
Các RowCommand, tất nhiên, sẽ xảy ra trước khi hàng đi vào chế độ chỉnh sửa và do đó trước khi databinds thả xuống. Vì vậy, tất cả mọi thứ hoạt động. Đó là một chút của một hack, nhưng tôi đã dành đủ thời gian cố gắng tìm ra lý do tại sao hàng chỉnh sửa đã không được databound đã.
Tôi nghĩ bạn cũng không cần (e.Row.RowType == DataControlRowType.DataRow) trừ khi bạn đã bị hack hàng tiêu đề có thể chỉnh sửa trong bằng cách nào đó. – quillbreaker
bạn không làm vì nó bắt đầu w/hàng tiêu đề và làm việc theo cách của nó xuống. bạn nhận được một lỗi nếu bạn không làm điều này, hoặc nó chỉ không hoạt động. – Jason
Hoặc bạn có thể kiểm tra xem hàng có đang ở chế độ chỉnh sửa bởi 'if (e.RowState && DataControlRowState.Edit)> 0 {}' này không –