-1

我正在尝试遍历一组数字,将它们与它们关联的复选框匹配,然后选中该框。

我的复选框设置如下:

<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变量添加属性?

我对这个设置没有死心,所以如果你知道更好的方法,我会全神贯注。感谢您的任何帮助和建议。

谢谢

很多好的建议。我稍后会尝试这些。在另一个项目上被搁置了。

解决了

好的,这是我的结束代码。感谢詹姆斯的帮助。

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

5 回答 5

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为您选择的数据类型即可。

于 2012-04-05T16:11:01.243 回答
2

如果您为您的复选框分配一个 ID,例如 "interest" + value,那么您可以使用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;
}
于 2012-04-05T16:09:02.657 回答
2

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

<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));
于 2012-04-05T16:12:15.603 回答
1

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

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

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

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

注意,如果是动态添加的控件,还是要使用FindControl()别人提到的方法,因为Visual Studio不会为你添加到.designer.cs文件中。

于 2012-04-05T16:14:05.720 回答
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
对于从控件中遍历值,您可以使用以下内容作为参考:-
将控件数组添加到 aspx 页面

我建议您使用 ASP.NET Checkbox 而不是 HTML < input type="checkbox">。

于 2012-04-05T16:31:45.843 回答