【问题标题】:Count the number of TextBoxes and CheckBoxes in a form计算表单中 TextBox 和 CheckBox 的数量
【发布时间】:2013-07-16 17:31:08
【问题描述】:

我的要求是当用户单击按钮'btnGetCount' 时,用id="form1" 计算直接存在于表单中的TextBox 和CheckBox 的总数。这是我尝试过的代码,但它不计算任何内容,并且计数器保持为零,尽管我在表单中有三个 TextBoxes 和两个 CheckBoxes。但是,如果我删除 foreach 循环并传递 TextBox control = new TextBox(); 而不是当前代码,那么它将计算第一个 TextBox 并且 countTB 将值返回为 1。

protected void btnGetCount_Click(object sender, EventArgs e)
    {
        Control control = new Control();

        int countCB = 0;
        int countTB = 0;
        foreach (Control c in this.Controls)
        {
            if (control.GetType() == typeof(CheckBox))
            {
                countCB++;
            }
            else if (control is TextBox)
            {
                countTB++;
            }
        }

        Response.Write("No of TextBoxes: " + countTB);
        Response.Write("<br>");
        Response.Write("No of CheckBoxes: " + countCB);
    }

【问题讨论】:

  • this.Controls? form1.Controls 呢?
  • 你是动态添加控件到表单吗?
  • @Valamas-AUS 我也尝试过,但结果相同。
  • @Valamas-AUS 不,我没有动态添加控件。
  • 试试foreach (WebControl c in this.Controls)

标签: c# asp.net checkbox textbox count


【解决方案1】:

您必须递归循环其他控件。

    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="txt" runat="server"></asp:TextBox>
    <asp:CheckBox ID="cb" runat="server"></asp:CheckBox>
    </div>
    </form>

protected void Page_Load(object sender, EventArgs e)
{
    var controls = form1.Controls;
    var tbCount = 0;
    var cbCount = 0;
    CountControls(ref tbCount, controls, ref cbCount);

    Response.Write(tbCount);
    Response.Write(cbCount);
}

private static void CountControls(ref int tbCount, ControlCollection controls, ref int cbCount)
{
    foreach (Control wc in controls)
    {
        if (wc is TextBox)
            tbCount++;
        else if (wc is CheckBox)
            cbCount++;
        else if(wc.Controls.Count > 0)
            CountControls(ref tbCount, wc.Controls, ref cbCount);
    }
}

【讨论】:

  • 试过这段代码,它适用于 TextBoxes,但为 CheckBox 添加了一个额外的计数。我会调试那个。 +1 :)
  • 我明白了,由于继承,它也将单选按钮计数为复选框,因此通过将 'is' 替换为 GetType() 和 typeOf() 逻辑,它可以正常工作。
【解决方案2】:

它允许给您零,因为您正在计算不可用的 Control 控件的类型,将您的代码更改为:

protected void btnGetCount_Click(object sender, EventArgs e)
    {

        int countCB = 0;
        int countTB = 0;
        foreach (Control c in this.Controls)
        {
            if (c.GetType() == typeof(CheckBox))
            {
                countCB++;
            }
            else if (c.GetType()== typeof(TextBox))
            {
                countTB++;
            }
        }

        Response.Write("No of TextBoxes: " + countTB);
        Response.Write("<br>");
        Response.Write("No of CheckBoxes: " + countCB);
    } 

【讨论】:

  • 是的,我试图在我的回答中指出这一点。不知道为什么我被否决了。尝试了 OP 的代码,它输出了 0。按照你和我发布的方式进行了尝试,它工作得很好。
  • pcnThird 您是否进行了其他更改?它仍然给我同样的结果。 PS:我没有给你投反对票。
  • else if 声明中,我使用了与您发布的相同条件,但除此之外,几乎相同。
  • 非常感谢各位的回答。我对您和 Alyafey 的代码进行了微小的更改,即 form1.Controls 而不是 this.Controls,它工作正常。再次感谢。 PS:pcnThird你删除了你的答案,必须使它+1。
【解决方案3】:

我相信你必须是递归的,this.Controls 只会返回它的直接子控件。如果TextBox 在其中的控制组中,您还需要查看容器控件。

查看其他 stackoverflow 的答案:How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?

编辑: 我意识到答案是针对 WinForms,但该解决方案仍然适用。

【讨论】:

  • 感谢您的意见。我正在经历那个。
【解决方案4】:

只需对 Alyafey、pcnThird 和 Valamas 建议的代码进行一些小的更改,我就编写了这个有效的代码。

protected void btnGetCount_Click(object sender, EventArgs e)
    {

        int countCB = 0;
        int countTB = 0;
        foreach (Control c in form1.Controls) //here is the minor change
        {
            if (c.GetType() == typeof(CheckBox))
            {
                countCB++;
            }
            else if (c.GetType()== typeof(TextBox))
            {
                countTB++;
            }
        }

        Response.Write("No of TextBoxes: " + countTB);
        Response.Write("<br>");
        Response.Write("No of CheckBoxes: " + countCB);
    } 

【讨论】:

  • 那么结果如何?这是需要的改变吗?
  • 我没有使用 this.Controls,而是使用了 form1.Controls.. :)
  • @Alyafey 我在您的代码中进行了更改,而不是在我的代码中。您已经通过将 control 替换为“c”来消除一个错误。它现在正在完美地计算 TextBox 和 CheckBox 的数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2013-02-26
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多