ASP.NET C#DataList - 在Child DataList中查找隐藏字段

时间:2013-10-08 21:49:30

标签: asp.net

我是ASP.NET新手。我整个上午一直在努力,但无法让它发挥作用。在我的DataList1中,有一个子dataList(childList),它列出了公司名称和复选框。我还将CompanyID存储在隐藏字段(hiddenCompanyID)中。

我喜欢做的是当用户检查一个框(在子Datalist下)时,它将触发事件(chkChildCompany_CheckedChanged)并从隐藏字段捕获CompanyID,以便我可以处理数据库更新。我无法想象如何在子Datalist中找到隐藏字段控件。

请帮忙, 谢谢,

<asp:DataList BackColor="#ffffff" id="DataList1" DataSourceID="dsCompanyListPartialMatch"  runat="server" Width="80%" DataKeyField="Company1Word"
    UseAccessibleHeader="true"
    CssClass="books"
    HeaderStyle-CssClass="header"
    ItemStyle-CssClass="item"
    AlternatingItemStyle-CssClass="alternating" 
    GridLines="Both"
    CellPadding="0"
    CellSpacing="0" BorderColor="Black"
    ItemStyle-BorderColor="Black" BorderWidth="0"
     HorizontalAlign="Center"
    RepeatDirection="Vertical" 
    >                
    <HeaderTemplate>
        <table border="0" width="100%">
        <tr class="div_hover">
            <th style="width: 5%; border-right:1px solid black; border-spacing:0;  text-align:center; "></th>
            <th style="width: 5%; border-right:1px solid black; border-spacing:0;  text-align:center; ">Num</th>
            <th style="width: 70%; border-right:1px solid black; border-spacing:0;  text-align:center; ">Company Name</th>
            <th style="width: 10%; border-right:1px solid black; border-spacing:0;  text-align:center; ">Add?</th>
        </tr>
        </table>
    </HeaderTemplate>

    <ItemStyle BorderColor="black" Font-Size="Medium" />

    <ItemTemplate>
        <table border="0" width="100%">
        <tr class="div_hover">
            <td style="width: 5%; border-right:1px solid black; border-spacing:0;  text-align:center; ">        
            <asp:LinkButton>
                <asp:LinkButton ID="LinkButton2" runat="server" Text="+" CommandArgument='<%#Container.ItemIndex%>'
                OnCommand="LinkButton1_Command"  
                Font-Underline="false"       
                Height="25"      
                Font-Bold="true"                  
                ></asp:LinkButton>
            </td>
            <td style="width: 5%; border-right:1px solid black; border-spacing:0; text-align:right; padding-right:10px;"><%#Eval("Row")%></td>
            <td style="width: 70%"><asp:Literal ID="litFoo" runat="server" Text='<%#Eval("Company")%>' /> </td>
            <td style="width: 10%;text-align:right;">
                <div style="<%# (Eval("CompanyID") == null || Eval("CompanyID").ToString() == "") ? "": "display: none" %>">
                    <asp:CheckBox id="check1" runat="server" />
                </div>

                <div style="<%# (Eval("CompanyID") == null || Eval("CompanyID").ToString() != "") ? "": "display: none" %>">
                <asp:HyperLink   
                    ID="HyperLink1"   
                    runat="server" ForeColor="Blue"
                    Text='<%# Eval("CompanyID")%>' 
                    NavigateUrl='<%# Eval("CompanyID", "/Apps/ERP/Other/CompanyInfo.asp?CompanyID={0}")%>'                               
                />
                </div> 
            </td>

            <asp:Label ID="lblRow" Visible="False" runat="Server" Text='<%# DataBinder.Eval(Container.DataItem, "Row") %>' />
        </tr>    
        </table>      
            <asp:Panel ID="pnlChildView" runat="server" style="padding-left:200px;">
                <asp:DataList ID="childList" runat="server" Width="100%">
                   <ItemTemplate>
                       <div  class="div_hover">
                        <table class="table1" width="80%">
                       <tr>
                          <td style="width: 60%; border-right:0px solid black; border-spacing:0;">&#8226; <%#Eval("CompanyName")%></td>
                           <td style="width: 20%;text-align:right; "><a href="/Apps/ERP/Other/CompanyInfo.asp?CompanyID=<%#Eval("CompanyID")%>" ><%#Eval("CompanyID")%></a></td> 

                           <td style="width: 20%;text-align:right;">
                                <asp:CheckBox id="chkChildCompany" runat="server" value="123Test"
                                AutoPostBack="true"
                               OnCheckedChanged="chkChildCompany_CheckedChanged"  /></td>                          
                           <asp:HiddenField ID="hiddenCompanyID" runat="server" Value='<%#Eval("CompanyID") %>' />                    
                       </tr>
                        </table>
                        </div>
                   </ItemTemplate>
               </asp:DataList>
           </asp:Panel>
    </ItemTemplate>           
</asp:DataList>

复选框事件

protected void chkChildCompany_CheckedChanged(object sender, EventArgs e)
    {
        //Process through child DataList (childList)
        //Capture the CompanyID from hidden field value if checkbox is checked;
        // Then I will update the database record with the ID....
    }

4 个答案:

答案 0 :(得分:1)

有几种不同的方法可以解决这个问题。我的第一直觉是将发件人转换为适当的类型,然后检查.Parent属性。这可能会让你这样做:

HiddenField hidden = (HiddenField) myCheckbox.Parent.FindControl("hiddenCompanyID");

如果这不起作用......另一种选择是嵌入一个已包含相应隐藏字段值的回发引用,该值由复选框触发。或者稍微修改一下,以便你有一个按钮,它接受一个CommandArgument参数。在这种情况下,您只需将其设置为&lt;%#Eval(“CompanyID”)%&gt;,然后在事件处理程序中就可以使用。

答案 1 :(得分:1)

我会在您的复选框中添加一个属性,然后从复选框本身获取您需要的值。

<asp:CheckBox id="chkChildCompany" runat="server" value="123Test"
                                AutoPostBack="true"      CustomAttribute='<%#Eval("CompanyID") %>'
                               OnCheckedChanged="chkChildCompany_CheckedChanged"  />

代码隐藏:

var CompanyID = (sender as CheckBox).Attributes["CustomAttribute"]

答案 2 :(得分:0)

您可以使用NamigContainer属性获取DataListItem,然后使用FindControl

protected void chkChildCompany_CheckedChanged(object sender, EventArgs e)
{
    var chk = (CheckBox) sender;
    var item = (DataListItem) chk.NamingContainer;
    var hiddenCompanyID = (HiddenField) item.FindControl("hiddenCompanyID");
    // here you are ...
} 

顺便说一句,此技术适用于所有网络数据绑定控件,例如RepeaterGridView等。使用NamingContainer比使用Parent.Parent或其他方法更安全。

答案 3 :(得分:-1)

在您的情况下,您应该将CompanyID存储在ViewState中而不是隐藏字段:

ViewState["MicrosoftID"] = "4536";

稍后,您可以像这样访问它:

protected void chkChildCompany_CheckedChanged(object sender, EventArgs e)
    {
        string companyID = ViewState["MicrosoftID"];
    }

希望有所帮助!