2009-05-07 44 views
23

Tôi đang cố gắng để có được một NET 3.5 GridView để hiển thị một giá trị được lựa chọn như chuỗi khi được hiển thị, và để hiển thị một DropDownList cho phép tôi chọn một giá trị từ một danh sách các tùy chọn khi được chỉnh sửa. Có vẻ đơn giản đủ?Chỉnh sửa hàng Gridview - liên kết động với một DropDownList

GridView của tôi trông như thế này (giản thể):

<asp:GridView ID="grvSecondaryLocations" runat="server" 
       DataKeyNames="ID" OnInit="grvSecondaryLocations_Init" 
       OnRowCommand="grvSecondaryLocations_RowCommand" 
       OnRowCancelingEdit="grvSecondaryLocations_RowCancelingEdit" 
       OnRowDeleting="grvSecondaryLocations_RowDeleting" 
       OnRowEditing="grvSecondaryLocations_RowEditing" 
       OnRowUpdating="grvSecondaryLocations_RowUpdating" > 
<Columns> 
    <asp:TemplateField> 
     <ItemTemplate> 
       <asp:Label ID="lblPbxTypeCaption" runat="server" 
           Text='<%# Eval("PBXTypeCaptionValue") %>' /> 
     </ItemTemplate> 
     <EditItemTemplate> 
         <asp:DropDownList ID="ddlPBXTypeNS" runat="server" 
           Width="200px" 
           DataTextField="CaptionValue" 
           DataValueField="OID" /> 
     </EditItemTemplate> 
    </asp:TemplateField> 
</asp:GridView> 

Lưới được hiển thị OK khi không ở chế độ chỉnh sửa - loại PBX chọn cho thấy giá trị của nó trong asp: Label. Không có gì ngạc nhiên.

Tôi tải danh sách các giá trị cho DropDownList vào một thành viên địa phương được gọi là _pbxTypes trong sự kiện OnLoad của biểu mẫu. Tôi đã xác minh điều này - nó hoạt động, các giá trị ở đó.

Bây giờ thử thách của tôi là: khi lưới chuyển sang chế độ chỉnh sửa cho một hàng cụ thể, tôi cần phải liên kết danh sách các PBX được lưu trữ trong _pbxTypes.

đơn giản đủ, tôi nghĩ - chỉ cần lấy thả xuống đối tượng danh sách trong trường hợp RowEditing và đính kèm danh sách:

protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; 

    DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 

Rắc rối là - Tôi không bao giờ có được bất cứ điều gì trở lại từ FindControl cuộc gọi - có vẻ như ddlPBXTypeNS không tồn tại (hoặc không thể tìm thấy).

Tôi đang thiếu gì ?? Phải là một cái gì đó thực sự ngu ngốc .... nhưng cho đến nay, tất cả Googling của tôi, đọc lên trên điều khiển GridView, và yêu cầu bạn bè đã không giúp đỡ.

Ai có thể phát hiện liên kết bị thiếu? ;-)

Trả lời

27

Khá dễ dàng ... Bạn đang làm sai, vì bởi sự kiện rằng sự kiểm soát không phải là ở đó:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && 
     (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
    { 
     // Here you will get the Control you need like: 
     DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); 
    } 
} 

Nghĩa là, nó sẽ chỉ có giá trị trong một DataRow (hàng thực sự có dữ liệu) và nếu nó ở chế độ Chỉnh sửa chế độ ... bởi vì bạn chỉ chỉnh sửa một hàng tại một thời điểm. Các e.Row.FindControl("ddlPBXTypeNS") sẽ chỉ tìm thấy sự kiểm soát mà bạn muốn.

+1

Tricky .... Tôi nhận được sự kiện này, nhưng RowState là "Alternate | Edit" - vì vậy IF của bạn không bao giờ đúng :-) –

+0

OK, tôi đã thay đổi nếu bạn kiểm tra bit "Chỉnh sửa" đang được đặt (bỏ qua bất kỳ bit khác có thể được thiết lập) và bây giờ nó hoạt động như một say mê! Cảm ơn một đống !! –

+0

chỉ cần thay đổi mã :) – balexandre

1

Tôi đang sử dụng ListView thay vì GridView trong 3.5. Khi người dùng muốn chỉnh sửa tôi đã đặt mục đã chọn của menu thả xuống thành giá trị hiện tại của cột đó cho bản ghi. Tôi có thể truy cập vào danh sách thả xuống trong sự kiện ItemDataBound. Dưới đây là các mã:

protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    // This stmt is used to execute the code only in case of edit 
    if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) 
    { 
     ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); 
     ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); 
    } 
} 
+0

nó không phải một danh sách là một GridView! – balexandre

+0

chính xác - và tôi thực sự không muốn thay đổi nó chỉ để làm cho nó hoạt động, nếu có thể ..... cảm ơn anyway! –

+1

balexandre ... tôi đã đề cập đến nó không phải là một GridView ... đây chỉ là một FYI không phải là một soln ... nó sẽ là tốt hơn nếu u guys tìm hiểu để cung cấp cho điểm để 'câu trả lời không chính xác' hơn là 'solns khác hoặc fyis ' –

0

Bạn có thể sử dụng SelectedValue:

<EditItemTemplate> 
    <asp:DropDownList ID="ddlPBXTypeNS" 
         runat="server" 
         Width="200px" 
         DataSourceID="YDS" 
         DataTextField="CaptionValue" 
         DataValueField="OID" 
         SelectedValue='<%# Bind("YourForeignKey") %>' /> 
    <asp:YourDataSource ID="YDS" ...../> 
</EditItemTemplate> 
1
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 
0

Các kiểm tra answer from balexandre hoạt động tuyệt vời. Tuy nhiên, nó sẽ tạo ra một vấn đề nếu thích nghi với một số tình huống khác.

Tôi đã sử dụng nó để thay đổi giá trị của hai điều khiển nhãn - lblEditModifiedBylblEditModifiedOn - khi tôi chỉnh sửa hàng, sao cho đúng ModifiedBy và ModifiedOn sẽ được lưu vào db trên 'Cập nhật'.

Khi tôi nhấp vào nút 'Cập nhật', trong sự kiện RowUpdating, nó hiển thị các giá trị mới mà tôi đã nhập trong danh sách OldValues.Tôi cần "giá trị cũ" thực sự như các giá trị Original_ khi cập nhật cơ sở dữ liệu. (Có một ObjectDataSource gắn liền với GridView.)

Việc sửa chữa này được sử dụng mã balexandre, nhưng trong một hình thức sửa đổi trong trường hợp gv_DataBound:

protected void gv_DataBound(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in gv.Rows) 
    { 
     if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
     { 
      // Here you will get the Control you need like: 
      ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; 
      ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); 
     } 
    } 
} 
-1
<asp:GridView ID="GridView1" runat="server" PageSize="2" AutoGenerateColumns="false" 
      AllowPaging="true" BackColor="White" BorderColor="#CC9966" BorderStyle="None" 
      BorderWidth="1px" CellPadding="4" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" 
      OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
      OnRowDeleting="GridView1_RowDeleting"> 
      <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
      <RowStyle BackColor="White" ForeColor="#330099" /> 
      <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
      <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
      <Columns> 
      <asp:TemplateField HeaderText="SerialNo"> 
      <ItemTemplate> 
      <%# Container .DataItemIndex+1 %>.&nbsp 
      </ItemTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollNo"> 
        <ItemTemplate> 
         <%--<asp:Label ID="lblrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="SName"> 
        <ItemTemplate> 
        <%--<asp:Label ID="lblsname" runat="server" Text='<%#Eval("SName")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtsname" runat="server" Text='<%#Eval("SName")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="C"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblc" runat="server" Text='<%#Eval ("C") %>'></asp:Label>--%> 
         <asp:TextBox ID="txtc" runat="server" Text='<%#Eval ("C") %>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Cpp"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblcpp" runat="server" Text='<%#Eval ("Cpp")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtcpp" runat="server" Text='<%#Eval ("Cpp")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Java"> 
        <ItemTemplate> 
         <%-- <asp:Label ID="lbljava" runat="server" Text='<%#Eval ("Java")%>'> </asp:Label>--%> 
         <asp:TextBox ID="txtjava" runat="server" Text='<%#Eval ("Java")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Edit" ShowHeader="False"> 
        <EditItemTemplate> 
         <asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" 
          CommandName="Update"></asp:LinkButton> 
         <asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" 
          CommandName="Cancel"></asp:LinkButton> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" 
          Text="Edit"></asp:LinkButton> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" /> 
       <asp:CommandField HeaderText="Select" ShowSelectButton="True" ShowHeader="True" /> 
      </Columns> 
     </asp:GridView> 
     <table> 
      <tr> 
       <td> 
        <asp:Label ID="lblrollno" runat="server" Text="RollNo"></asp:Label> 
        <asp:TextBox ID="txtrollno" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblsname" runat="server" Text="SName"></asp:Label> 
        <asp:TextBox ID="txtsname" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblc" runat="server" Text="C"></asp:Label> 
        <asp:TextBox ID="txtc" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblcpp" runat="server" Text="Cpp"></asp:Label> 
        <asp:TextBox ID="txtcpp" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lbljava" runat="server" Text="Java"></asp:Label> 
        <asp:TextBox ID="txtjava" runat="server"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" /> 
        <asp:Button ID="Reset" runat="server" Text="Reset" OnClick="Reset_Click" /> 
       </td> 
      </tr> 
     </table> 
+2

Chào mừng bạn đến với StackOverflow: nếu bạn đăng mã, XML hoặc mẫu dữ liệu, hãy ** tô sáng những dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mẫu mã" ('{}') trên thanh công cụ của trình chỉnh sửa để định dạng và cú pháp độc đáo làm nổi bật nó! –

Các vấn đề liên quan