ASP.NET C#数据列表-在子数据列表中查找隐藏字段

ASP.NET C#数据列表-在子数据列表中查找隐藏字段,asp.net,Asp.net,我是ASP.NET新手。我整个上午都在试,但没能成功。在我的DataList1中,有一个子dataList(childList),它列出了公司名称和复选框。我还将CompanyID存储在隐藏字段(hiddenCompanyID)中 我喜欢做的是,当用户选中一个框(在子数据列表下)时,它将触发事件(chkChildCompany_CheckedChanged)并从隐藏字段捕获CompanyID,以便我可以处理数据库更新。我不知道如何在子数据列表中找到隐藏的字段控件 请帮忙, 谢谢 您可以使用Nam

我是ASP.NET新手。我整个上午都在试,但没能成功。在我的DataList1中,有一个子dataList(childList),它列出了公司名称和复选框。我还将CompanyID存储在隐藏字段(hiddenCompanyID)中

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

请帮忙, 谢谢


您可以使用
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 ...
} 

顺便说一句,这种技术适用于所有web数据绑定控件,如
Repeater
GridView
等。使用
NamingContainer
比使用
Parent.Parent
或其他方法更安全。

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

ViewState["MicrosoftID"] = "4536";
稍后,您可以通过以下方式访问它:

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

希望有帮助

有几种不同的方法来解决这个问题。我的第一反应是将发送者强制转换为适当的类型,然后检查.Parent属性。这可能允许您执行以下操作:

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

如果那不起作用。。。另一个选项是嵌入回发引用,该引用已经包含相应的隐藏字段值,该值由复选框触发。或者稍微修改一下,这样就有了一个按钮,它接受commandargumentparam。在本例中,您只需将其设置为,然后在事件处理程序中即可使用。

我将向您的复选框添加一个属性,然后从复选框本身获取所需的值

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

对不起,你能告诉我怎么做吗?这会在childData中的某个地方吗?谢谢你能给我看一下你在隐藏字段中存储公司ID的代码吗?迪莫在这里找错了。很明显,每个数据列表行的CompanyID都必须不同,否则为什么会有它。我的意思是在viewstate中存储每行的每个CompanyID。因此,如果您存储每行的每个CompanyID,您如何知道以后在代码中使用哪一个呢?如果可行,这是一个很好的建议。然而。。。我有点怀疑!你试过这个吗,安德烈?我不确定自定义属性是否会在回发过程中保持不变。我以前肯定使用过它,我记得这样做的警告是,您无法从某些ASP控件访问“Attributes”属性,但我认为使用复选框可以正常工作。此外,如果我没记错,只要您在aspx中声明该属性,而不是在代码后面,它被坚持,但我必须承认,我有点生疏了这个主题,现在你不受欢迎,如果有帮助的话,考虑一下投票的答案!我如何投票选择多个答案?
HiddenField hidden = (HiddenField) myCheckbox.Parent.FindControl("hiddenCompanyID");
<asp:CheckBox id="chkChildCompany" runat="server" value="123Test"
                                AutoPostBack="true"      CustomAttribute='<%#Eval("CompanyID") %>'
                               OnCheckedChanged="chkChildCompany_CheckedChanged"  />
var CompanyID = (sender as CheckBox).Attributes["CustomAttribute"]