其他情况能在Click事件中引用动态生成的控件,而我的Page_Load()中的代码运行后不能引用?代码帖下:
private void Page_Load(object sender, System.EventArgs e)
{
SqlConnection QuestConn=new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=moon");
SqlCommand QuestCmd=QuestConn.CreateCommand();
try
{
QuestCmd.CommandText="select * from StuInfo where ExamId= '" + Session["Id"].ToString()+"'";
QuestConn.Open();
SqlDataReader QuestRd=QuestCmd.ExecuteReader();
QuestRd.Read();               
if(QuestRd["LogYn"].ToString().Trim().Equals("1"))
{
QuestRd.Close();
QuestConn.Close();
MyPanel.Visible=true;
Response.Write("<script language=\"javascript\">"+"\n");
Response.Write("alert(\"不能刷新!请与管理员联系,重新登录。\")"+"\n</script>");
}
else
{
Response.Write(Session["Id"]+"&nbsp;&nbsp;&nbsp;&nbsp"+Session["Name"]+"<Font color=\"red\">&nbsp;&nbsp;(请不要刷新网页)</Font>");
QuestRd.Close();
QuestCmd.CommandText="update StuInfo set LogYn='1'";
QuestCmd.ExecuteReader();
Literal LitCap=new Literal();
MyPanel.Controls.Add(LitCap);
LitCap.Text="<B>一、单选题(每题2分,共52分).</B><BR><BR>";
QuestRd.Close();
QuestConn.Close();
    
byte i=1;
Session["sc"]="";
Session["mc"]="";
Session["yn"]="";
QuestCmd.CommandText="select top 26 * from sc order by newid()";
QuestConn.Open();
QuestRd=QuestCmd.ExecuteReader();
while(QuestRd.Read())
{
Literal LitTxt=new Literal();
Literal LitBl=new Literal();
RadioButtonList RadSc=new RadioButtonList();
MyPanel.Controls.Add(LitTxt);
MyPanel.Controls.Add(RadSc);
MyPanel.Controls.Add(LitBl);
RadSc.ID="RadSc"+i.ToString();
LitTxt.Text=i.ToString()+"、"+Server.HtmlEncode(QuestRd["Question"].ToString())+"<Blockquote>";
LitBl.Text="</Blockquote>";
RadSc.Font.Size=11;
for(byte j=1;j<=4;j++)
{
RadSc.Items.Add(Server.HtmlEncode(QuestRd["Choice"+j.ToString()].ToString()));
RadSc.Items[j-1].Value=j.ToString();
}
Session["sc"]+=QuestRd["Answer"].ToString().Trim();

i++;
}
QuestRd.Close();
QuestConn.Close(); Literal LitCap1=new Literal();
MyPanel.Controls.Add(LitCap1);
LitCap1.Text="<B>二、判断题(每题2分,共28分).</B><BR><BR>";
QuestCmd.CommandText="select top 14 * from yn order by newid()";
QuestConn.Open();
QuestRd=QuestCmd.ExecuteReader();
while(QuestRd.Read())
{
Literal LitTxt=new Literal();
Literal LitBl=new Literal();
RadioButtonList RadYn=new RadioButtonList();
RadYn.ID="RadYn"+i.ToString();
LitTxt.Text=i.ToString()+"、"+Server.HtmlEncode(QuestRd["Question"].ToString())+"<Blockquote>";
LitBl.Text="</Blockquote>";
RadYn.Font.Size=11;
RadYn.Items.Add(Server.HtmlEncode("正确"));
RadYn.Items[0].Value="1";
RadYn.Items.Add(Server.HtmlEncode("错误"));
RadYn.Items[1].Value="2";
Session["yn"]+=QuestRd["Answer"].ToString().Trim();
MyPanel.Controls.Add(LitTxt);
MyPanel.Controls.Add(RadYn);
MyPanel.Controls.Add(LitBl);
i++;
}
QuestRd.Close();
QuestConn.Close();
Literal LitCap2=new Literal();
MyPanel.Controls.Add(LitCap2);
LitCap2.Text="<B>三、多选题(每题2分,共20分).</B><BR><BR>";
QuestCmd.CommandText="select top 10 * from mc order by newid()";
QuestConn.Open();
QuestRd=QuestCmd.ExecuteReader();
while(QuestRd.Read())
{
Literal LitTxt=new Literal();
Literal LitBl=new Literal();
CheckBoxList ChkMc=new CheckBoxList();
ChkMc.ID="ChkMc"+i.ToString();
LitTxt.Text=i.ToString()+"、"+Server.HtmlEncode(QuestRd["Question"].ToString())+"<Blockquote>";
LitBl.Text="</Blockquote>";
ChkMc.Font.Size=11;
for(byte j=1;j<=4;j++)
{
ChkMc.Items.Add(Server.HtmlEncode(QuestRd["Choice"+j.ToString()].ToString()));
ChkMc.Items[j-1].Value=j.ToString();
}
Session["mc"]+=QuestRd["Answer"].ToString().Trim();
MyPanel.Controls.Add(LitTxt);
MyPanel.Controls.Add(ChkMc);
MyPanel.Controls.Add(LitBl);
i++;
}
QuestRd.Close();
QuestConn.Close();
ButSend.Visible=true;
Literal LitHtm=new Literal();
LitHtm.Text="<BR><DIV ALIGN=\"center\">";
Literal LitHtmEnd=new Literal();
LitHtmEnd.Text="</DIV>";
MyPanel.Controls.Add(LitHtm);
MyPanel.Controls.Add(ButSend);
MyPanel.Controls.Add(LitHtmEnd);
Literal LitCr=new Literal();
LitCr.Text="<HR align=\"center\" color=\"#7bb66b\"><BR><Div align=\"center\">版权所有:重庆渝中高级职业学校信息中心  姚渝涛</Div>";
MyPanel.Controls.Add(LitCr);
}
}
catch(NullReferenceException)
{
Response.Write("<script language=\"javascript\">"+"\n");
Response.Write("alert(\"非法操作!\")"+"\n</script>");
}
finally
{
QuestConn.Close();
}
}

解决方案 »

  1.   

    不知道你要什么,这Page_Load是在哪里?页面里还是code behind?是一次都没执行?如果是在你的页面,确认你没设置AutoEventWireup =false, 应该是<%@ Page AutoEventWireup =true ... %>或没有AutoEventWireup这一项如果是code behind,确认在你的页面里
    <%@ Page AutoEventWireup =false ... %>在后面的编码里,在InitializeComponents 或OnInit里,你有this.Load += new EventHandler(Page_Load);
      

  2.   

    saucer(思归) 老大,你每天晚上不睡觉吗?  
    5:00 还在回答问题!
      

  3.   

    在click中动态产生的控件,下一次如果想用是不是需要在装载一次呀?
      

  4.   

    真的感谢思归兄弟给我解答问题!
    但你说的都有,我在Click中想引用在Page_Load( )中生成的控件,提示说“未将对象引用设置到对象的实例”,用MyPanel.Controls.Count测试出来,控件数为0。如果在Page_Load( )中测试出来则是正常的控件数,是不是离开Page_Load( )控件就无效了,或是生成的只是客户端的控件,要用客户端脚本来读取?但我这有一段类似的代码却是能用的?郁闷中
      

  5.   

    make sure your controls are re-created upon postback
      

  6.   

    动态生成的控件必须要在Page_Load中重新生成一变,否则那些动态生成的控件是不保留状态的
    以前也遇到搂主的这个问题
    但通过上面的方法解决了