none
快抓狂了,為什麼Array會錯誤 RRS feed

  • 問題

  • 以下是程式碼

    using System;
    using System.Collections.Generic;
    using System.Data.OleDb;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    public partial class Order_Account : System.Web.UI.Page
    {
        private Control[] con={};
        int count = 0;
     
        protected void Page_Load(object sender, EventArgs e)
        {
            //取得所有控制項並存到陣列中
            Control[] cons =  GetPageAllControlID(this.Page);
     
            //將取得的控制項找到ID
            if (cons != null || cons.Length != 0)
            {
                foreach (Control consid in cons)
                {
                    Response.Write(consid.GetType() + "<br/>");
                }
            }
            
            
        }
    
        //取得page 同控制項
    
        protected Control[] GetPageAllControlID(Control controls)
        {
            foreach (Control ctl in controls.Controls)
            {
                if (ctl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
                {
                    this.con[this.count] = ctl;
                    count++;                
                }
               
                //將控制向再丟到
                if (ctl.HasControls())
                {
                    GetPageAllControlID(ctl);
                }
            }
    
            return con;
        }
    
        }
    
    }

    為什麼一直出現該死的 System.IndexOutOfRangeException 我完全不知道這個程式哪裡會超出Array範圍。

    請各位高手幫幫我,越快越好,我真的快被氣哭了。

    2015年6月19日 下午 12:39

所有回覆

  • this.count++;
    2015年6月19日 下午 12:40
  • 你用了遞迴,但又用了全域變數,這樣不爆才有鬼吧?

    用 List<Control> 當容器不是比較好嗎,而且它又可以擴張...

    另外,在爆氣前,用除錯器加中斷點去看,能讓你的火氣降一大半。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    2015年6月19日 下午 12:53
    版主
  • 你用了遞迴,但又用了全域變數,這樣不爆才有鬼吧?

    用 List<Control> 當容器不是比較好嗎,而且它又可以擴張...

    另外,在爆氣前,用除錯器加中斷點去看,能讓你的火氣降一大半。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    那應該要怎麼解? 遞迴有return阿,等到return就是中斷點了。為什麼還會出現錯誤呢?
    2015年6月19日 下午 02:57
  • 你可以在比 return 還早的地方設中斷點....

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2015年6月19日 下午 03:07
    版主
  • 你用了遞迴,但又用了全域變數,這樣不爆才有鬼吧?

    用 List<Control> 當容器不是比較好嗎,而且它又可以擴張...

    另外,在爆氣前,用除錯器加中斷點去看,能讓你的火氣降一大半。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    小朱大第一句話就完全點到樓主的問題了

    這個迴圈不適合使用全域變數喔,試著把 count 用區域變數處理吧

    IMPORTANT: 教你用單步偵錯,是希望你理解 count 這個值的變化(以及為何全域變數不適合的情況),你需要徹底理解這個問題 ...


    dino

    2015年6月19日 下午 04:37
  • 您的GetPageAllControlID並沒有準備一個陣列或集合來存放取得的結果, 而是直接使用一個並未建立的con陣列, 您可以將GetPageAllControlID函式改成:

       protected Control[] GetPageAllControlID(Control controls)
       
    {

    List<Control> lstControl=new List<Control>();

    foreach (Control ctl in controls.Controls)
           
    {
               
    if (ctl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
               
    {
                   
    lstControl.Add(ctl);
                }
              
               
    //將控制向再丟到
               
    if (ctl.HasControls())
               
    {
                   
    GetPageAllControlID(ctl);
                }

           
    }

        return con;

    }

    而Page_Load則改成這樣:

    List<Control> cons =  GetPageAllControlID(this.Page);


    2015年6月21日 上午 07:09