如何在ASP.NET中获取控件的ID

时间:2012-04-05 15:59:25

标签: c# asp.net controls

我试图遍历一组数字,将它们与他们关联的复选框匹配,并勾选该框。

我的复选框设置如下:

<input type="checkbox" runat="server" id="someID" name="somename" value="1234" />

目前页面加载时的代码如下:

foreach (string interest in interests_Var){
   foreach (var c in Page.Controls)
   {
   }
}

interests_Var是包含不同数字的数组。我们假设其中一个是1234。循环遍历页面控件时,我想将控件的值与我的数字进行比较。如果它等于我的号码,我想再应用属性checked="checked"。我假设我必须找到我正在使用的控件的ID,然后使用该ID添加新属性。或者有没有办法可以使用c变量添加属性?

我并没有死定这个设置,所以如果你知道一个更好的方法,我会全力以赴。感谢您提供任何帮助和建议。

感谢

很多好的建议。我会尝试一下这些。对另一个项目进行了侧面跟踪。

解决

好的,这是我的结束代码。感谢James的帮助。

foreach (string interest in interests_Var)
{
       foreach (var chkCtrl in Panel1.Controls.OfType<CheckBox>())
       {
           if (chkCtrl.Attributes["value"].ToString() == interest.ToString())
          {
               chkCtrl.Checked = true;
          }
     }
}

5 个答案:

答案 0 :(得分:3)

我假设您使用多个复选框并存储了多个值。 最好使用Asp:Checkbox,而不是简单地将runat =“server”属性分配给输入控件。

假设您有这样的数据源:

public class MyClass
{
   public String Name {get;set;}
   public int Number {get;set;}
}

使用此服务器控件:

<asp:CheckBoxList ID="cblMyList" runat="server" DataTextField="Name" DataValueField="Number">

Name属性将用作显示字符串,其中Number是实际属于HTTP Post的值。                     

在OnInit-Eventhandler中你可能会像这样绑定:

List<MyClass> values = //...
cblMyList.DataSource = values;
cblMyList.DataBind();
foreach (ListItem item in this.cblMyList.Items)
{
   if(interests.Contains(item.Value))
   {
    item.Selected = true;
   }
}

使用以下代码完成所有选定的值:

List<int> selectedValues = cblMyList.Items.Cast<ListItem>().Where(x => x.Selected).Select(x => int.Parse(x.Value)).ToList();

我选择int作为DataValueField的数据类型。当然,您可以使用其他类型,只需将int替换为您选择的数据类型。

答案 1 :(得分:2)

如果您为复选框指定了“兴趣”+ value这样的ID,那么您可以使用FindControl按兴趣查看复选框:

foreach (string interest in interests_Var)
{
    HtmlInputCheckBox checkBox = (HtmlInputCheckBox)this.FindControl("interest" + interest);
    if (checkBox == null)
        throw new InvalidOperationException("Missing check box for " + interest);
    checkBox.Checked = true;
}

答案 2 :(得分:2)

最好将CheckBox控件放入PanelPlaceHolder,因为这样您就不必担心遍历控件层次结构的递归逻辑。

<asp:Panel ID="Panel1" runat="server">
    <asp:CheckBox ID="CheckBox1" runat="server" Text="Testing" value="1234" />
    ...
</asp:Panel>

通过将控件放入容器中,您可以循环遍历该元素的子控件:

foreach (string interest in interests_Var)
{
    foreach (var chkCtrl in Panel1.Controls.OfType<CheckBox>())
    {
        chkCtrl.Checked = chkCtrl.Attributes["value"].Contains(interest.ToString());
    }
}

假设interests_VarList,这是使用LINQ执行此操作的较短方法:

interests_Var.ForEach(str => plcInvoiceDetail.Controls.OfType<CheckBox>()
    .Select(chk => chk.Checked = chk.Attributes["value"] == str));

答案 3 :(得分:1)

如果这是一个Web窗体应用程序,并且您没有按照自己的描述进行操作,则可以将标记更改为:

<asp:CheckBox id="someID" runat="server" />

然后它将在.designer.cs文件中定义。这样,您可以在代码中简单地引用它,如下所示:

if ( someID.Checked )
{
    // do whatever
}

请注意,如果它是动态添加的控件,您仍然必须使用其他人提到的FindControl()方法,因为Visual Studio不会将其添加到.designer.cs文件中你。

答案 4 :(得分:0)

您可以使用以下文章中描述的控件数组: -
http://msdn.microsoft.com/en-us/library/aa289500%28v=VS.71%29.aspx
http://www.codeproject.com/Articles/21159/How-to-Create-a-Control-Array-in-C
要从控件中遍历值,您可以使用以下内容作为参考: -
Add array of controls to an aspx page

我建议你使用ASP.NET Checkbox而不是HTML&lt;输入类型=“复选框”&gt;。