2013-07-17 258 views
2

我的要求是當用戶單擊按鈕'btnGetCount'時,計算直接位於表單內的文本框和複選框的總數,其中id="form1"。這裏是我嘗試過的代碼,但它不計算任何東西,計數器仍然爲零,儘管我在表單中有三個TextBoxes和兩個CheckBox。但是,如果我刪除foreach循環並通過TextBox control = new TextBox();而不是當前代碼,那麼它會計算第一個TextBox,並且countTB將返回值作爲一個值。計算表格中文本框和複選框的數量

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); 
    } 
+0

this.Controls?那麼form1.Controls呢? –

+0

你是否動態地向表單添加控件? –

+0

@ Valamas-AUS我也嘗試過,但它產生了相同的結果。 – RahulD

回答

4

您必須遞歸通過其他控制迴路。

<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); 
    } 
} 
+0

非常感謝您的回答。看起來很不錯,會試試這個。 – RahulD

+0

試過這段代碼,它對TextBoxes工作正常,但爲CheckBox增加了一個額外的計數。我會調試。 +1 :) – RahulD

+0

我明白了,它是因爲繼承而將複選框計數爲單選按鈕,因此通過用GetType()和typeOf()邏輯代替'is',它可以正常工作。 – RahulD

3

它可以讓你零,因爲你指望這是不可更改代碼到你的控制控制的類型:

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); 
    } 
+0

是的,我試圖在我的答案中指出這一點。不知道我爲什麼被低估。試了OP的代碼,它輸出0.試了你和我發佈它的方式,它工作得很好。 – pcnThird

+0

pcnThird您做了其他更改嗎?它仍然給我同樣的結果。 PS:我沒有倒下你。 – RahulD

+0

那麼在'else if'語句中,我使用了與您發佈的條件相同的條件,但除此之外,它幾乎相同。 – pcnThird

0

如果這樣做的由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); 
    } 
+0

那麼結果是什麼?這是需要改變的嗎? – Alyafey

+0

而不是this.Controls,我做了form1.Controls .. :) – RahulD

+0

@Alyafey我在你的代碼中做了這個改變,而不是在我的代碼中。你已經通過用'c'取代控制而刪除了一個錯誤。它現在完美地計算了TextBox和CheckBox的數量。 – RahulD