我有一串0,1字符,标定某些多选框是否被选中,当我改变dropdownlist的值后就根据其值动态绑定一组多项框,并根据前面的0,1串确定是否被选中,我的代码如下:
protected void ddlModule_SelectedIndexChanged(object sender, EventArgs e)
    {
        //this.pHolderFunc.Visible = true;
        int ID = Convert.ToInt32((sender as DropDownList).SelectedValue);
        string sql = "select * from [AllFunc] where ModuleNum='" + ID + "'";
        SqlDataReader sdr = Operate.sdr(sql);
        while (sdr.Read())
        {
            count++;
            this.pHolderFunc.Controls.Add(new LiteralControl("  "));
            CheckBox cb = new CheckBox();  //动态生成checkbox
            cb.ID = "cb"+count.ToString(); //本来想根据这个ID找的
            cb.Text = sdr["FuncName"].ToString();
            int FuncID = Convert.ToInt32(sdr["FuncNum"]);
            cb.TabIndex = (short)FuncID;
            if (userDate.Authority[FuncID] == "1")//userDate是自定义的一个类
                cb.Checked = true;
            this.pHolderFunc.Controls.Add(cb);
            if (count%5==0)
            {
                this.pHolderFunc.Controls.Add(new LiteralControl("<br>"));
            }
            
        }
        if (Conn.State == ConnectionState.Open)
            Conn.Close();
        sdr.Close();
        ViewState["cbNum"] = count;
        //Response.Write(ID);
    }
我btn_click的代码:
    protected void btnSave_Click(object sender, EventArgs e)
    {
        int FuncID = 0;
        count =(int) ViewState["cbNum"];
        for (int i = 1; i < count; i++)
        {
            CheckBox cb = (CheckBox)this.pHolderFunc.FindControl("cb" + i.ToString());
            FuncID = Convert.ToInt32(cb.TabIndex);
            if (cb.Checked)
            {
                userDate.Authority[FuncID] = "1";
            }
        }
    }
当执行时会报错说:未初始化该控件,然后经过调试发现,每当click时又从page_load然后在去btn_click事件,所以此时固然找不到由于selectindexchanged事件触发而动态形成的单选控件,所以请大家帮忙想想办法我如何解决这个问题?我想实现的功能再说明一下:想通过根据droplist值的不同从数据库检索相应选项,并初始化其值,包括是否选中,然后再单击确定将多选框的值保存进数据库,如果有其他方法,请各位赐教,万分感激,谢谢!

解决方案 »

  1.   

    在Page_load事件中要有
    if (!IsPostBack)
    {
        //初始绑定你的多选框
    }
      

  2.   

    如果在if (!IsPostBack) 绑定的话,再次Page_load的话它还不是不执行if里面的内容。

        //初始绑定你的多选框 
    }
      

  3.   

    效果实现了,不过有点不明白了,我是这样做的,当selectIndexChanged的时候我用个viewstate保存选项的值,并通过该参数动态生成控件,然后当确定的时候,在利用page_load再次根据viewstate中的数据形成一次控件,然后再通过Findcontrol()找到该控件并取值,我就不太明白我是page_load的时候又一次生成了控件,为什么我之前的选择的信息仍然能保留???