程序的功能是:动态生成试题,然后提交后,核对答案首先我在Page_Load动态添加控件,然后增加一个button,button事件里用到之前动态添加的控件,但在实际运行时,PostBack之后,系统提示错误“System.NullReferenceException: 未将对象引用设置到对象的实例。”protected void Page_Load(object sender, EventArgs e)
{ //字符串生成器
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
..........
//生成SqlConnection对象
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
string strSQL = " SELECT TOP (10) subjectid, subjectcontent, rightkey FROM judge ORDER BY NEWID()";
//创建SqlCommand对象
SqlCommand cmd_judge = new SqlCommand(strSQL, cn);
SqlDataReader Qreader = cmd_judge.ExecuteReader(); int Qnumber = 1;
//动态创建控件 while (Qreader.Read())
{
Literal QLiteral = new Literal();
QLiteral.Mode = LiteralMode.Transform;
Panel1.Controls.Add(QLiteral);
if (!IsPostBack)
{
if (Qnumber != 1) QLiteral.Text = QLiteral.Text + "<br><br>";
QLiteral.Text = QLiteral.Text + Qnumber.ToString() + " " + "【" + Qreader["subjectid"].ToString() + "】" + Qreader["subjectcontent"].ToString();
}
//加入正确答案的label
Label Alabel = new Label();
Panel1.Controls.Add(Alabel);
if (!IsPostBack)
{
Alabel.ID = "Alab" + Qnumber.ToString();
Alabel.Text = Qreader["rightkey"].ToString().Trim();
Alabel.ForeColor = Color.Red;
Alabel.Visible = false;
}
//加入选项
RadioButtonList Qradio = new RadioButtonList();
Panel1.Controls.Add(Qradio);
if (!IsPostBack)
{
Qradio.ID = "Qrad" + Qnumber.ToString();
Qradio.Items.Add("正确");
Qradio.Items[0].Value = "True";
Qradio.Items.Add("错误");
Qradio.Items[1].Value = "False";
}
Qnumber++;
}
}
button部分
RadioButtonList tmpRad = (RadioButtonList)Panel1.FindControl("Qrad1" );
Response.Write(tmpRad.Items[0].Text.ToString());
{ //字符串生成器
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
..........
//生成SqlConnection对象
SqlConnection cn = new SqlConnection(bldr.ConnectionString);
cn.Open();
string strSQL = " SELECT TOP (10) subjectid, subjectcontent, rightkey FROM judge ORDER BY NEWID()";
//创建SqlCommand对象
SqlCommand cmd_judge = new SqlCommand(strSQL, cn);
SqlDataReader Qreader = cmd_judge.ExecuteReader(); int Qnumber = 1;
//动态创建控件 while (Qreader.Read())
{
Literal QLiteral = new Literal();
QLiteral.Mode = LiteralMode.Transform;
Panel1.Controls.Add(QLiteral);
if (!IsPostBack)
{
if (Qnumber != 1) QLiteral.Text = QLiteral.Text + "<br><br>";
QLiteral.Text = QLiteral.Text + Qnumber.ToString() + " " + "【" + Qreader["subjectid"].ToString() + "】" + Qreader["subjectcontent"].ToString();
}
//加入正确答案的label
Label Alabel = new Label();
Panel1.Controls.Add(Alabel);
if (!IsPostBack)
{
Alabel.ID = "Alab" + Qnumber.ToString();
Alabel.Text = Qreader["rightkey"].ToString().Trim();
Alabel.ForeColor = Color.Red;
Alabel.Visible = false;
}
//加入选项
RadioButtonList Qradio = new RadioButtonList();
Panel1.Controls.Add(Qradio);
if (!IsPostBack)
{
Qradio.ID = "Qrad" + Qnumber.ToString();
Qradio.Items.Add("正确");
Qradio.Items[0].Value = "True";
Qradio.Items.Add("错误");
Qradio.Items[1].Value = "False";
}
Qnumber++;
}
}
button部分
RadioButtonList tmpRad = (RadioButtonList)Panel1.FindControl("Qrad1" );
Response.Write(tmpRad.Items[0].Text.ToString());
如果IsPostBack后,保证持行了 while (Qreader.Read())
{
Literal QLiteral = new Literal();
QLiteral.Mode = LiteralMode.Transform;
Panel1.Controls.Add(QLiteral);
if (!IsPostBack)
{
if (Qnumber != 1) QLiteral.Text = QLiteral.Text + "<br><br>";
QLiteral.Text = QLiteral.Text + Qnumber.ToString() + " " + "【" + Qreader["subjectid"].ToString() + "】" + Qreader["subjectcontent"].ToString();
}
//加入正确答案的label
Label Alabel = new Label();
Panel1.Controls.Add(Alabel);
if (!IsPostBack)
{
Alabel.ID = "Alab" + Qnumber.ToString();
Alabel.Text = Qreader["rightkey"].ToString().Trim();
Alabel.ForeColor = Color.Red;
Alabel.Visible = false;
}
//加入选项
RadioButtonList Qradio = new RadioButtonList();
Panel1.Controls.Add(Qradio);
if (!IsPostBack)
{
Qradio.ID = "Qrad" + Qnumber.ToString();
Qradio.Items.Add("正确");
Qradio.Items[0].Value = "True";
Qradio.Items.Add("错误");
Qradio.Items[1].Value = "False";
}
Qnumber++;
}代码的话,把Alabel.ID = "Alab" + Qnumber.ToString();
语句提到if(!IsPostBack)外试试
但是如果把Qradio.ID = "Qrad" + Qnumber.ToString();
Qradio.Items.Add("正确");
Qradio.Items[0].Value = "True";
Qradio.Items.Add("错误");
Qradio.Items[1].Value = "False";
这些放到if(!IsPostBack)之外,问题是解决了
但多了一遍题目与选项的输出问题是不是出在IsPostBack之后,那些动态创建的控件的 信息没有被保存下来?~
如果是重新加载了一次的话,你可以考虑在加载前把Items清空:Qradio.Items.Clear()
就是,IsPostBack后,页面呈现的还是第一次生成的试卷但是就是button事件有问题,但我看他那个例子里的引用,好像差不多思路的啊...
好像ID的赋值改在if(!IsPostBack)外面我试试先
Panel1.Controls.Add(...);
if (!IsPostBack)
{
...
}
改成如下试一试:
if (!IsPostBack)
{
...
}
Panel1.Controls.Add(...);
Panel1.Controls.Add(Alabel);只有ID必须在将控件加入控件树之前必须赋值,其它一切属性都可以在加入之后再赋值。
谢谢指点,很精确的点出问题
你说的那个问题我再好好看下
这个控件的数量
我当时的思路是,随机的取出10个题,这个是确定的,然后就依次把它们显示出来
你的意思是,用Qnumber确定控件的数量,然后添加
而不是用while (Qreader.Read()){....}这个思路?
DataSet DataContext
{
get{ if(ViewState["dc"]==null)return0; else return (DataSet)ViewState["dc"];}
set{ ViewState["dc"]=value; }
}void CreateSubControls(bool flag)
{
Placeholder1.Controls.Clear();
for(int i=0;i<DataContext.Rows.Count)
{
Literal QLiteral = new Literal();
QLiteral.ID = "Literal" + QNum.ToString();
Placeholder1.Controls.Add(QLiteral);
Label Alabel = new Label();
......//根据DataContext[i]设置QLiteral的值
Alabel.ID= .....;
.....Add(Alabel);
if(flag)
......//根据DataContext[i]设置Alabel的值
RadioButtonList Qradio = new RadioButtonList();
Qradio.ID = .....;
.....Add(Qradio);
if(flag)
......//根据DataContext[i]设置Qradio的值
Qradio.SelectedIndexChanged += new EventHandler(abc);
}
}private bool RefreshFlag=false;void abc(object sender,EventArgs e)
{
..... // 获得客户端点击的问题号 pos,并且更新 DataContext[pos] 中的数据。
RefreshFlag = true;
}void Page_load(....)
{
CreateSubControls(false);
}void Page_PreRender(....)
{
if(!this.IsPostback)
{
DataContext= ..... //从数据库中读出记录并放入DataSet中。
RefreshFlag = true;
}
if(RefreshFlag)
CreateSubControls(true);
}
实际上,Page_Load中逻辑上根本不需要判断 !IsPostback。许多“asp.net入门”代码都是非常简单的,因此把这个判断相关的代码放在 Page_load中。正确的做法是放在 PreRender 中。
{
get{ return (DataSet)ViewState["dc"];}
set{ ViewState["dc"]=value; }
} void CreateSubControls(bool flag)
{
Placeholder1.Controls.Clear();
if(DataContext!=null)
for(int i=0;i <DataContext.Rows.Count)
{