我是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;">• <%#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....
}
答案 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 ...
}
顺便说一句,此技术适用于所有网络数据绑定控件,例如Repeater
,GridView
等。使用NamingContainer
比使用Parent.Parent
或其他方法更安全。
答案 3 :(得分:-1)
在您的情况下,您应该将CompanyID存储在ViewState中而不是隐藏字段:
ViewState["MicrosoftID"] = "4536";
稍后,您可以像这样访问它:
protected void chkChildCompany_CheckedChanged(object sender, EventArgs e)
{
string companyID = ViewState["MicrosoftID"];
}
希望有所帮助!