如何计算asp.net表单中的复选框

时间:2017-11-08 14:55:36

标签: c# asp.net checkbox webforms

ASP.NET:

<asp:Panel ID="pnlFilter" runat="server">
    <div class="dvFilter">
        <input type="checkbox" id="cb01" checked="checked" />
        <label for="cb01">All</label>
    </div>
    <div class="dvFilter">
        <input type="checkbox" id="cb02" checked="checked" />
        <label for="cb02">None</label>
    </div>
</asp:Panel>

C#:

foreach (Control item in this.form1.Controls)
{
    System.Web.UI.HtmlControls.HtmlInputCheckBox _cbx = item as System.Web.UI.HtmlControls.HtmlInputCheckBox;
    if (_cbx != null)
    {
        if (_cbx.Checked)
        {
            //Do something: 
            Response.Write(_cbx.Name + " was checked.<br />");
        }
    }

}

我获得了null变量的_cbx值。

如何更新它以便我能够获取所有checked输入类型复选框的ID。

我尝试了这个答案:Count the number of TextBoxes and CheckBoxes in a form但也不适合我。

7 个答案:

答案 0 :(得分:2)

如果要使用<input type="checkbox">,则需要解析DOM。

我建议您使用<asp:CheckBox>代替<input type="checkbox">。然后你可以从c#访问你的控件

在您的查找中:
var _cbx = item as System.Web.UI.WebControls.CheckBox;

您可以获取所有复选框,而无需循环遍历所有控件。
使用LINQ:
this.form1.Controls.Where(c=>c.GetType() == typeof(CheckBox))

答案 1 :(得分:1)

我认为问题是你的复选框不能在服务器上运行。因此,它们在代码隐藏中没有“分配”控件。尝试将属性runat =“server”添加到您的复选框。就像你在面板中一样。

答案 2 :(得分:1)

使用此:

foreach (HtmlElement element in webBrowser1.Document.All)
{
    System.Web.UI.HtmlControls.HtmlInputCheckBox _cbx = element as System.Web.UI.HtmlControls.HtmlInputCheckBox;
    if (_cbx != null)
    {
        if (_cbx.Checked)
        {
            //Do something: 
            Response.Write(_cbx.Name + " was checked.<br />");
        }
    }
}

答案 3 :(得分:1)

首先,您需要添加runat="server"或将其更改为asp:CheckBox控件。

但是如果添加它们,你找不到它们的原因是因为它们处于另一个控制之下。所以在pnlFilter中查找它们。

<asp:Panel ID="pnlFilter" runat="server">
    <div class="dvFilter">
        <input type="checkbox" id="cb01" checked="checked" runat="server" />
        <label for="cb01">All</label>
    </div>
    <div class="dvFilter">
        <input type="checkbox" id="cb02" checked="checked" runat="server" />
        <label for="cb02">None</label>
    </div>
</asp:Panel>

背后的代码

foreach (Control item in pnlFilter.Controls)
{
    HtmlInputCheckBox _cbx = item as HtmlInputCheckBox;
    if (_cbx != null)
    {
        if (_cbx.Checked)
        {
            //Do something: 
            Response.Write(_cbx.Name + " was checked.<br />");
        }
    }
}

答案 4 :(得分:1)

我认为答案是所有建议更改的组合。 使复选框runat服务器具有可用的服务器端:

<asp:Panel ID="pnlFilter" runat="server">
    <div class="dvFilter">
        <input type="checkbox" id="cb01" checked="checked" runat="server" />
        <label for="cb01">All</label>
    </div>
    <div class="dvFilter">
        <input type="checkbox" id="cb02" checked="checked" runat="server" />
        <label for="cb02">None</label>
    </div>
</asp:Panel>

正如所建议的那样,对面板的(子)控件进行交互:

foreach (Control item in this.pnlFilter.Controls)
{
    System.Web.UI.HtmlControls.HtmlInputCheckBox _cbx = item as System.Web.UI.HtmlControls.HtmlInputCheckBox;
    if (_cbx != null)
    {
        if (_cbx.Checked)
        {
            //Do something: 
            Response.Write(_cbx.Name + " was checked.<br />");
        }
    }

}

或者,如果您将复选框更改为asp:Checkbox,则类型将为System.Web.UI.WebControls.CheckBox

答案 5 :(得分:1)

我认为通过前端流程访问前端的东西会更好。

例如,收集JQuery所需的已选中复选框ID并将其保存在HiddenField内,然后通过请求将其返回到后端。

实例

<asp:Panel ID="pnlFilter" runat="server">
    <div class="dvFilter">
        <input type="checkbox" id="cb01" checked="checked" />
        <label for="cb01">All</label>
    </div>
    <div class="dvFilter">
        <input type="checkbox" id="cb02" checked="checked" />
        <label for="cb02">None</label>
    </div>
    <input type="hidden" id="hdfIds" name="hdfIds" />
</asp:Panel>
<asp:Button ID="Button1" runat="server" Text="Button" />

JQuery部分(首先链接JQuery&amp; json2 lib)

function recoverCbxStatus() {
    if (hdfIds.value) {
        var ids = JSON.parse(hdfIds.value);
        ids.forEach(function (id) {
            $('#' + id).prop('checked', true);
        });
    }
}

function refreshIds() {
    var ids = [];
    $('input:checkbox[id^="cb"]:checked').each(function () {
        ids.push($(this).attr("id"));
    });
    hdfIds.value = JSON.stringify(ids);
}

$(document).ready(function () {
    recoverCbxStatus();
    refreshIds();
});

$('input:checkbox[id^="cb"]').change(function () {
    refreshIds();
});

后端(Nuget Json.NET)

protected void Page_Load(object sender, EventArgs e)
{
    string idsJson = Request["hdfIds"];
    List<string> ids;
    if (idsJson != null)
    {
        ids = JsonConvert.DeserializeObject<List<string>>(idsJson);
        Response.Write("count: " + ids.Count);
    }
}

答案 6 :(得分:0)

您可以使用GridView。代码方面这样做 -

for (int i = 0; i < **yourGridViewId** .Rows.Count; i++)
    {

CheckBox cb = ((CheckBox)**yourGridViewId** .Rows[i].FindControl(" **yourCheckboxId**"));
....

}