我在页面关联代码中使用代码创建控件,可是在下一次传到服务器上时,这个控件却无法通过访问。例如:我有个CheckBoxList,然后我在代码中创建ListItem,加入它,然后在按钮回传后它的Items里却没有我创建的控件我怀疑是状态问题,可我设置了这个控件的状态为trueasp.net 2.0

解决方案 »

  1.   

    当然跟了,就是不知道原因啊。我有2个按钮,第一个按钮事件里创建checkboxlist的ListItem。在另一个按钮的事件里读取checkboxList.Items.Count为0
      

  2.   

    把代码贴出来是否是你回传后在 page_load里面把CheckBoxList清空了?
      

  3.   

    应该在page_init中初始化控件
    如果你在page_load里初始化,不要用
    if (!IsPostBack)
    {
      初始化控件
    }
    应该每次都初始化一次。
    当然,最好还是在page_init中比较好。
      

  4.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class manage_Right_Privilege : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            sdsRole.ConnectionString=Lsh.ZjWeb.Config.DBConfig.GetDBConnStr();
            if (!IsPostBack)
            {
                BuildModuleTree();
                tblPrivelge.Visible = false;
                lblHint1.Visible = false;
                lblHint2.Visible = false;
            }   
        }    private void BuildModuleTree()
        {
            SqlDataReader sqldr = Lsh.ZjWeb.Config.DBConfig.ExecSql("select * from SysModule where parent is null");
            while (sqldr.Read())
            {
                TreeNode aNode = new TreeNode(sqldr["ModuleName"].ToString(), sqldr["ModuleNo"].ToString());
                tvwModule.Nodes.Add(aNode);
                BuildTree(aNode);
            }
            sqldr.Close();    }    private void BuildTree(TreeNode node)
        {
            SqlDataReader sqldr = Lsh.ZjWeb.Config.DBConfig.ExecSql("select * from SysModule where Parent='"+node.Value+"'");
            while(sqldr.Read())
            {
                TreeNode aNode = new TreeNode(sqldr["ModuleName"].ToString(), sqldr["ModuleNo"].ToString());
                node.ChildNodes.Add(aNode);
                BuildTree(aNode);
            }
            sqldr.Close();
        }    protected void btnContinue_Click(object sender,EventArgs e)
        {
            if(lbxRole.SelectedItem==null)
            {
                lblHint1.Visible=true;
                return;
            }
            if (tvwModule.SelectedNode==null)
            {
                lblHint2.Visible = true;
                return;
            }
            SetRoleIDAndModuleNo();
            ReadRight();
            tblRoleModule.Visible = false;
            tblPrivelge.Visible = true;
        }    private void SetRoleIDAndModuleNo()
        {
            lblRoleName.Text=lbxRole.SelectedItem.Text;
            tbxRoleID.Text = lbxRole.SelectedItem.Value;        lblModuleName.Text = tvwModule.SelectedNode.Text;
            tbxModuleNo.Text = tvwModule.SelectedNode.Value;    }    private void ReadRight()
        {
            cblRight.Items.Clear();
            SqlDataReader sqldr = Lsh.ZjWeb.Config.DBConfig.ExecSql("select rt.RightNo,rt.RightName from RightType rt,ModuleRightRel mrr where rt.RightNo=mrr.RightNo and mrr.ModuleID='"+tvwModule.SelectedNode.Value+"'");
            ListItemCollection lic = new ListItemCollection();
            while(sqldr.Read())
            {
                ListItem li = new ListItem(sqldr["RightName"].ToString(), sqldr["RightNo"].ToString());
                lic.Add(li);
            }
            cblRight.DataSource = lic;
            cblRight.DataBind();        tdRightSel.Controls.Add(cblRight);
            sqldr.Close();        sqldr = Lsh.ZjWeb.Config.DBConfig.ExecSql("select RightNo from Privilege where RoleID=" + lbxRole.SelectedItem.Value + " and ModuleNo='"+tvwModule.SelectedNode.Value+"'");
            while (sqldr.Read())
            {
                ListItem ali = cblRight.Items.FindByValue(sqldr["RightNo"].ToString());
                if ( ali!= null)
                {
                    ali.Selected = true;
                }
            }
            sqldr.Close();
        }    protected void btnSubmit_Click(object sender, EventArgs e)
        {
            int roleID = Int32.Parse(tbxRoleID.Text);
            String moduleNo = tbxModuleNo.Text;
            SqlCommand sqlcmd = Lsh.ZjWeb.Config.DBConfig.GetSqlCmd("delete from Privilege where RoleID="+roleID+" and ModuleNo='"+moduleNo+"'");
            sqlcmd.ExecuteNonQuery();
            SqlCommand sqlcmd1 = Lsh.ZjWeb.Config.DBConfig.GetSqlCmd("insert into Privilege(RoleID,ModuleNo,RightNo) values(@RoleID,@ModuleNo,@RightNo)");
            sqlcmd1.Parameters.Add("RoleID",SqlDbType.Int);
            sqlcmd1.Parameters.Add("ModuleNo",SqlDbType.NVarChar,20);
            sqlcmd1.Parameters.Add("RightNo", SqlDbType.NVarChar, 20);
            for (int i = 0; i < cblRight.Items.Count; i++)
            {
                if (cblRight.Items[i].Selected)
                {
                    sqlcmd1.Parameters["RoleID"].Value = roleID;
                    sqlcmd1.Parameters["ModuleNo"].Value = moduleNo;
                    sqlcmd1.Parameters["RightNo"].Value = cblRight.Items[i].Value;
                    sqlcmd1.ExecuteNonQuery();
                }
            }
            Response.Write("<script language=javascript type=text/javascript>alert('保存成功!')</script>");
            tblRoleModule.Visible = true;
            tblPrivelge.Visible = false;
        }
    }没有清空的!
      

  5.   

    这里设置的CheckBoxList:
    cblRight.Items.Clear();
            SqlDataReader sqldr = Lsh.ZjWeb.Config.DBConfig.ExecSql("select rt.RightNo,rt.RightName from RightType rt,ModuleRightRel mrr where rt.RightNo=mrr.RightNo and mrr.ModuleID='"+tvwModule.SelectedNode.Value+"'");
            ListItemCollection lic = new ListItemCollection();
            while(sqldr.Read())
            {
                ListItem li = new ListItem(sqldr["RightName"].ToString(), sqldr["RightNo"].ToString());
                lic.Add(li);
            }
            cblRight.DataSource = lic;
            cblRight.DataBind();        tdRightSel.Controls.Add(cblRight);
            sqldr.Close();这里读:for (int i = 0; i < cblRight.Items.Count; i++)
            {
                if (cblRight.Items[i].Selected)
                {
                    sqlcmd1.Parameters["RoleID"].Value = roleID;
                    sqlcmd1.Parameters["ModuleNo"].Value = moduleNo;
                    sqlcmd1.Parameters["RightNo"].Value = cblRight.Items[i].Value;
                    sqlcmd1.ExecuteNonQuery();
                }
            }虽然:cblRight.Items.Clear();这个清空方法,但它是在protected void btnContinue_Click(object sender,EventArgs e)
    事件里进行的
      

  6.   

    cblRight.DataSource = lic;
    cblRight.DataBind();我在这里调用cblRight.Items.Count返回的是4for (int i = 0; i < cblRight.Items.Count; i++)
    这语句中的cblRight.Items.Count返回0
      

  7.   

    每次postback时需要先重新初始化控件,然后再可以访问控件
      

  8.   

    先说明,代码没有细看。
    如果是动态生成的控件,必须在页面PageLoad前加载才行,而且每次PostBack必须重新加载。
    不然的话,控件的状态不会被保存。详细的资料,可以去cnblogs搜索动态加载控件,有很好的回复。你要做的是:定义一个ViewState["CreateControl"]来存放是否要加载控件,如果是的话,则在PageLoad中调用创建控件的方法。例:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //绑定你的数据
            }
            if(ViewState["CreateControl"] != null)
                CreateControl();
        }    protected void btn_Click(object sender, EventArgs e)
        {
            if(ViewState["CreateControl"] == null)
            {
                CreateControl();
                ViewState["CreateControl"] = 1;
            }
        }    private void CreateControl()
        {
            //你创建控件的代码
        }
    代码是手写的,可能不对,但原理如此。
      

  9.   

    to:
    jimh(Jimmy) 
    每次postback时需要先重新初始化控件,然后再可以访问控件应该是asp.net自己初始化控件啊?
    例如我这个吧:
    我的每个ListItem从数据库读出来到,难道我每次都在Page_Load中读取出来重新生成?如果我在这里调用CheckBoxList.Clear的话,然后再读数据的话,那每项的ListIten的Selected属性不就全不在了.
      

  10.   

    这个没有办法,要不重新刷新页面,要不在LOAD事件每次都寝化一下.
      

  11.   

    关键是我CheckBoxList已经在aspx文件添加: 
    <asp:CheckBoxList ID="cblRight" runat="server"></asp:CheckBoxList>
    我只是动态创建它的项
      

  12.   

    同意sisoxy(行风) asp.net动态添加控件是有这个问题