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 :(得分:2)
每次调用页面时都需要初始化数组,而不仅仅是在第一次加载页面时。
答案 1 :(得分:1)
您的复选框数组不是页面视图状态的一部分,因此不会在回发时为您初始化。单击该按钮会导致回发并且cb数组未初始化。
你可以这样做:
foreach (Control ctrl in Panel2.Controls)
{
CheckBox cb = ctrl as CheckBox;
if (cb != null && cb.Checked)
{
//processing check boxes
}
}
答案 2 :(得分:0)
奥利弗的回答是正确的。您需要做的就是删除检查页面的IsPostBack属性的if条件,这就是原因: 当您在运行时创建控件然后将其附加到asp页面的结构时,每次将页面传递到客户端时都会呈现它。 因此,当您第一次请求页面时,一旦创建它,它就会被渲染。 如果页面再次发回服务器,则应按顺序创建控件的对象,然后从页面的视图状态加载其先前的状态(对于您的情况下的Checked属性,为true或false)< / p>