2008-10-05 33 views
7

Đây là mã của tôi trong một GridView đó là ràng buộc trong thời gian chạy:Làm thế nào để bạn liên kết một DropDownList trong một GridView trong trường EditItemTemplate?

... 
<asp:templatefield> 
    <edititemtemplate> 
     <asp:dropdownlist runat="server" id="ddgvOpp" /> 
    </edititemtemplate> 
    <itemtemplate> 
     <%# Eval("opponent.name") %> 
    </itemtemplate> 
</asp:templatefield> 
... 

Tôi muốn ràng buộc DropDownList "ddgvOpp" nhưng tôi không biết làm thế nào. Tôi nên, nhưng tôi không. Đây là những gì tôi có, nhưng tôi tiếp tục nhận được một lỗi "tài liệu tham khảo đối tượng", có ý nghĩa:

protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) //skip header row 
    { 
     DropDownList ddOpp = (DropDownList)e.Row.Cells[5].FindControl("ddgvOpp"); 
     BindOpponentDD(ddOpp); 
    } 
} 

đâu BindOpponentDD() chỉ là nơi DropDownList được dân cư. Tôi không làm điều này trong sự kiện đúng? Nếu không, tôi cần phải đặt nó vào?

Cảm ơn bạn rất nhiều ...

Trả lời

5

Ok, tôi đoán tôi chỉ là câm. Tôi đã hiểu rồi.

Trong trường hợp RowDataBound, chỉ cần thêm điều kiện sau đây:

if (myGridView.EditIndex == e.Row.RowIndex) 
{ 
    //do work 
} 
+0

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

+0

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

+0

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 –

1
protected void grdDevelopment_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) 
    {  
     DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddlBuildServers"); 
    } 
} 

Hãy thử điều này một

Điều này sẽ giúp u

1

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 đã.

2

Nhờ Saurabh Tripathi,

Giải pháp bạn đã cung cấp đã làm việc cho tôi. Trong sử dụng sự kiện gridView_RowDataBound().

if(gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow) 
{ 
    // FindControl 
    // And populate it 
} 

Nếu có ai gặp vấn đề tương tự, hãy dùng thử.

Chúc mừng.

0

Mã này sẽ được làm những gì bạn muốn:

<asp:TemplateField HeaderText="garantia" SortExpression="garantia"> 
<EditItemTemplate> 
    <asp:DropDownList ID="ddgvOpp" runat="server" SelectedValue='<%# Bind("opponent.name") %>'> 
     <asp:ListItem Text="Si" Value="True"></asp:ListItem> 
     <asp:ListItem Text="No" Value="False"></asp:ListItem> 
    </asp:DropDownList> 
</EditItemTemplate> 
<ItemTemplate> 
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("opponent.name") %>'></asp:Label> 
</ItemTemplate> 
Các vấn đề liên quan