【问题标题】:How to count the checkboxes in a asp.net form如何计算asp.net表单中的复选框
【发布时间】:2018-04-21 07:45:34
【问题描述】:

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 />");
        }
    }

}

我得到了_cbx 变量的null 值。

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

我尝试了这个答案:Count the number of TextBoxes and CheckBoxes in a form,但也没有为我工作。

【问题讨论】:

  • 你应该看看runat=server
  • 已经试过了,但让我再“重试”一次 :)
  • 我不应该使用 runat="server" 因为我正在寻找 HtmlInputCheckBox... 除非我错了?
  • 除 Lokki 外,其他解决方案均无效,但存在一些限制。我会 +1 但不会接受答案,因为它没有完全解决我的问题。我现在手动检查了每个 CheckBox...。如果我遇到或可以找出问题所在,我将发布解决方案。谢谢。
  • 这对link 有帮助,而这个link 是如果您想以复选框列表的方式进行操作,希望对您有所帮助

标签: c# asp.net checkbox webforms


【解决方案1】:

如果要使用&lt;input type="checkbox"&gt;,则需要解析DOM。

我建议你使用&lt;asp:CheckBox&gt; 而不是&lt;input type="checkbox"&gt;。然后你可以从 c# 访问你的控件

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

您可以在不循环所有控件的情况下获取所有复选框。
使用 LINQ:
this.form1.Controls.Where(c=&gt;c.GetType() == typeof(CheckBox))

【讨论】:

  • 在 UpdatePanel 中是否重要?
  • input 是客户端控件,应该在客户端使用。 asp:CheckBox - 是一个服务器端控件,可以在服务器端使用。
  • 好的,谢谢。这是一个网络表单
  • 我可以像这样访问它:var y = cb01.Checked; 没问题,但是如果我有 20 个复选框,那就是很多手动工作......
【解决方案2】:

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

【讨论】:

  • 不,它仍然以null 的形式出现:/
  • 我不应该使用 runat="server" 因为我正在寻找 HtmlInputCheckBox... 除非我错了?
  • 不,你是对的。我没有正确阅读。为了让它工作,你应该使用 asp:checkbox 并在你的代码隐藏中寻找那些
  • 仍然有同样的问题
【解决方案3】:

使用这个:

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 />");
        }
    }
}

【讨论】:

  • webBrowser1?那是什么?
  • 代码示例要求您的应用程序包含一个名为 WebBrowser1 的 WebBrowser 控件。在 MSDN 帮助中找到示例:msdn.microsoft.com/en-us/library/…
  • 不幸的是我没有。
  • 你的页面名称是什么?用你的页面名称更改 webBrowser。它应该可以工作。
【解决方案4】:

首先,你需要添加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 />");
        }
    }
}

【讨论】:

    【解决方案5】:

    我认为答案是所有建议更改的组合。 使复选框在服务器上运行以使服务器端可用:

    <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

    【讨论】:

      【解决方案6】:

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

      例如,通过 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 & 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);
          }
      }
      

      【讨论】:

        【解决方案7】:

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

        for (int i = 0; i < **yourGridViewId** .Rows.Count; i++)
            {
        
        CheckBox cb = ((CheckBox)**yourGridViewId** .Rows[i].FindControl(" **yourCheckboxId**"));
        ....
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-21
          • 1970-01-01
          • 2021-03-31
          相关资源
          最近更新 更多