在代码中创建控件的问题 我在页面关联代码中使用代码创建控件,可是在下一次传到服务器上时,这个控件却无法通过访问。例如:我有个CheckBoxList,然后我在代码中创建ListItem,加入它,然后在按钮回传后它的Items里却没有我创建的控件我怀疑是状态问题,可我设置了这个控件的状态为trueasp.net 2.0 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当然跟了,就是不知道原因啊。我有2个按钮,第一个按钮事件里创建checkboxlist的ListItem。在另一个按钮的事件里读取checkboxList.Items.Count为0 把代码贴出来是否是你回传后在 page_load里面把CheckBoxList清空了? 应该在page_init中初始化控件如果你在page_load里初始化,不要用if (!IsPostBack){ 初始化控件}应该每次都初始化一次。当然,最好还是在page_init中比较好。 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; }}没有清空的! 这里设置的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)事件里进行的 cblRight.DataSource = lic;cblRight.DataBind();我在这里调用cblRight.Items.Count返回的是4for (int i = 0; i < cblRight.Items.Count; i++)这语句中的cblRight.Items.Count返回0 每次postback时需要先重新初始化控件,然后再可以访问控件 先说明,代码没有细看。如果是动态生成的控件,必须在页面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() { //你创建控件的代码 }代码是手写的,可能不对,但原理如此。 to:jimh(Jimmy) 每次postback时需要先重新初始化控件,然后再可以访问控件应该是asp.net自己初始化控件啊?例如我这个吧:我的每个ListItem从数据库读出来到,难道我每次都在Page_Load中读取出来重新生成?如果我在这里调用CheckBoxList.Clear的话,然后再读数据的话,那每项的ListIten的Selected属性不就全不在了. 这个没有办法,要不重新刷新页面,要不在LOAD事件每次都寝化一下. 关键是我CheckBoxList已经在aspx文件添加: <asp:CheckBoxList ID="cblRight" runat="server"></asp:CheckBoxList>我只是动态创建它的项 同意sisoxy(行风) asp.net动态添加控件是有这个问题 这个如何排序? treeview启用了自绘(OwnerDrawText),节点上编辑时,编辑框错位该怎么解决? .Net中的特性(Attribute)有什么用? C#label怎么竖着显示 登陆问题 win2003下IIS支持缓存的问题. 100分找jmail组件和说明 郁闷,C# 用OLEDB读excel,为什么有个字段为null??? 如何用C#在本地建立mdb文件并操作它 求助,一个计时功能,在线等待 请问如何将DataGridViewTextBoxColumn转换成DataGridViewLinkColumn??? 为什么要请求权限?
如果你在page_load里初始化,不要用
if (!IsPostBack)
{
初始化控件
}
应该每次都初始化一次。
当然,最好还是在page_init中比较好。
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;
}
}没有清空的!
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)
事件里进行的
cblRight.DataBind();我在这里调用cblRight.Items.Count返回的是4for (int i = 0; i < cblRight.Items.Count; i++)
这语句中的cblRight.Items.Count返回0
如果是动态生成的控件,必须在页面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()
{
//你创建控件的代码
}
代码是手写的,可能不对,但原理如此。
jimh(Jimmy)
每次postback时需要先重新初始化控件,然后再可以访问控件应该是asp.net自己初始化控件啊?
例如我这个吧:
我的每个ListItem从数据库读出来到,难道我每次都在Page_Load中读取出来重新生成?如果我在这里调用CheckBoxList.Clear的话,然后再读数据的话,那每项的ListIten的Selected属性不就全不在了.
<asp:CheckBoxList ID="cblRight" runat="server"></asp:CheckBoxList>
我只是动态创建它的项