2010-01-19 60 views
-1
public static CheckBox[] cb = null; 
int z=0; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     { 
     cb = new CheckBox[count - k]; 
     //Database code......... 
     while (dr.Read())//read data from access database 
       { 
      cb[z] = new CheckBox(); 
        cb[z].Text = dr["Member_Name"].ToString(); 
         Panel2.Controls.Add(cb[z]); 
         Panel2.Controls.Add(new LiteralControl("</br>")); 
         z = z + 1; 
     } 
    } 
} 
protected void Button6_Click(object sender, EventArgs e) 
{ 
     for (int x = 0; x < cb.Length; x++)//ERROR IS HERE:Object reference not set to an instance of an object. 
     { 
     if (cb[x].Checked == true) 
       { 
       //processing check boxes  
     } 
    } 
} 
+0

尝试让你的代码在代码框中,请。这不是很可读。 – Younes 2010-01-19 09:01:14

+0

因为你有cb [z]复选框,所以不知道你所指的复选框。 – Younes 2010-01-19 09:02:28

+0

发布问题,而不仅仅是一些代码! – 2010-01-19 09:14:09

回答

2

你的阵列需要每次页面被调用时被初始化,当页面第一次加载不仅。

0

奥利弗的答案是正确的。所有你需要做的只是删除检查页面的IsPostBack属性的if条件,这就是为什么: 当你在运行时创建一个控件,然后将它附加到asp页面的结构中时,每当页面交付给客户。 所以当你创建一次页面被请求的第一次它被渲染。 如果页面被重新发布回服务器,则应该创建控件的对象,以便渲染,然后从页面的视图状态加载其以前的状态(在您的情况下,对于Checked属性,为true或false)

1

您的复选框数组不是页面视图状态的一部分,因此在回发时不会为您初始化。单击该按钮会导致回发并且cb阵列未初始化。

你可以这样做,而不是:

foreach (Control ctrl in Panel2.Controls) 
     { 
      CheckBox cb = ctrl as CheckBox; 
      if (cb != null && cb.Checked) 
       { 
       //processing check boxes  
       } 
     }