整个页面的思路如下:
我想先将数据库中的选择题添加到页面中显示出来.使用动态添加RadioButtonList的方法来显示.然后通过按钮获取用户答案.问题出现在我的获取循环中,提示"未将对象引用设置到对象的实例子"我跟踪了一下,发现 "rbl"的值为空,有高手告诉我说是findControl有问题,我想请问一下,动态生成的RadioButtonList要如何获取喃?
还是其他的代码有问题?
请前辈高手帮帮忙哈
代码在下面
//先显示题目及选项:
public void panal1_load()
{
string courseId=Convert.ToString(Session["courseId"]);
//获取数据库中的记录
SqlDataReader reader=(new DB()).xz(Convert.ToString(1),courseId);Hashtable ht_stuTest1=new Hashtable();
int num=1;
while(reader.Read())
{
Literal lit_testContent=new Literal();
RadioButtonList rbtnlist=new RadioButtonList();
rbtnlist.ID="rbtnlist"+num.ToString();
lit_testContent.Text="<br>"+num.ToString()+"、"+Server.HtmlEncode(reader["subQst"].ToString())+"<br>";
rbtnlist.Items.Add("1: "+Server.HtmlEncode(reader["subAnsA"].ToString()));
rbtnlist.Items.Add("2: "+Server.HtmlEncode(reader["subAnsB"].ToString()));
rbtnlist.Items.Add("3: "+Server.HtmlEncode(reader["subAnsC"].ToString()));
rbtnlist.Items.Add("4: "+Server.HtmlEncode(reader["subAnsD"].ToString()));
rbtnlist.RepeatDirection=RepeatDirection.Horizontal;
//得到题目的正确答案,并添加到哈希表中
string testId=reader["subId"].ToString();
ht_stuTest1.Add(num.ToString(),testId.ToString());for(int j=1;j<=4;j++)
{
rbtnlist.Items[j-1].Value=j.ToString();
}
Panel1.Controls.Add(lit_testContent);
Panel1.Controls.Add(rbtnlist);
num++;
}
Session["subIdXz"]=ht_stuTest1;
}====================================================
//获取答案public void getXZanswers()
{
string stuId=Convert.ToString(Session["stuId"]);
string courseId=Convert.ToString(Session["courseId"]);
Hashtable ht_stuTest1=(Hashtable)Session["subIdXz"];
bool flag;
for(int i=1;i<=10;i++)
{
string subId;
string index="";
string ans; IDictionaryEnumerator myEnm = ht_stuTest1.GetEnumerator();
flag=false;
while(myEnm.MoveNext()&&!flag)
{
if(myEnm.Key.Equals(i.ToString()))
{
flag=true;
RadioButtonList rbl=new RadioButtonList();
rbl.ID="rbl"+i.ToString();
//这里我跟踪的时候发现rbl为空
rbl=(RadioButtonList)this.Panel1.FindControl("rbtnlist"+i.ToString());subId=myEnm.Value.ToString();
if(rbl.SelectedIndex<0)
{index=Convert.ToString(0);}
else
{index=Convert.ToString((Convert.ToInt32(rbl.SelectedIndex))+1);}
ans=(new DB()).getAnsR(subId);
(new DB()).insertTestStudent(stuId,subId,courseId,ans,index);
}
}
}
}=================================================================
//下面是错误提示
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误:
行 241:
行 242: subId=myEnm.Value.ToString();
行 243: if(rbl.SelectedIndex<0)
行 244: {index=Convert.ToString(0);}
行 245: else
源文件: c:\inetpub\wwwroot\examonline\test.aspx.cs 行: 243 堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
examOnline.test.getXZanswers() in c:\inetpub\wwwroot\examonline\test.aspx.cs:243
examOnline.test.Button1_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\examonline\test.aspx.cs:371
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()
我想先将数据库中的选择题添加到页面中显示出来.使用动态添加RadioButtonList的方法来显示.然后通过按钮获取用户答案.问题出现在我的获取循环中,提示"未将对象引用设置到对象的实例子"我跟踪了一下,发现 "rbl"的值为空,有高手告诉我说是findControl有问题,我想请问一下,动态生成的RadioButtonList要如何获取喃?
还是其他的代码有问题?
请前辈高手帮帮忙哈
代码在下面
//先显示题目及选项:
public void panal1_load()
{
string courseId=Convert.ToString(Session["courseId"]);
//获取数据库中的记录
SqlDataReader reader=(new DB()).xz(Convert.ToString(1),courseId);Hashtable ht_stuTest1=new Hashtable();
int num=1;
while(reader.Read())
{
Literal lit_testContent=new Literal();
RadioButtonList rbtnlist=new RadioButtonList();
rbtnlist.ID="rbtnlist"+num.ToString();
lit_testContent.Text="<br>"+num.ToString()+"、"+Server.HtmlEncode(reader["subQst"].ToString())+"<br>";
rbtnlist.Items.Add("1: "+Server.HtmlEncode(reader["subAnsA"].ToString()));
rbtnlist.Items.Add("2: "+Server.HtmlEncode(reader["subAnsB"].ToString()));
rbtnlist.Items.Add("3: "+Server.HtmlEncode(reader["subAnsC"].ToString()));
rbtnlist.Items.Add("4: "+Server.HtmlEncode(reader["subAnsD"].ToString()));
rbtnlist.RepeatDirection=RepeatDirection.Horizontal;
//得到题目的正确答案,并添加到哈希表中
string testId=reader["subId"].ToString();
ht_stuTest1.Add(num.ToString(),testId.ToString());for(int j=1;j<=4;j++)
{
rbtnlist.Items[j-1].Value=j.ToString();
}
Panel1.Controls.Add(lit_testContent);
Panel1.Controls.Add(rbtnlist);
num++;
}
Session["subIdXz"]=ht_stuTest1;
}====================================================
//获取答案public void getXZanswers()
{
string stuId=Convert.ToString(Session["stuId"]);
string courseId=Convert.ToString(Session["courseId"]);
Hashtable ht_stuTest1=(Hashtable)Session["subIdXz"];
bool flag;
for(int i=1;i<=10;i++)
{
string subId;
string index="";
string ans; IDictionaryEnumerator myEnm = ht_stuTest1.GetEnumerator();
flag=false;
while(myEnm.MoveNext()&&!flag)
{
if(myEnm.Key.Equals(i.ToString()))
{
flag=true;
RadioButtonList rbl=new RadioButtonList();
rbl.ID="rbl"+i.ToString();
//这里我跟踪的时候发现rbl为空
rbl=(RadioButtonList)this.Panel1.FindControl("rbtnlist"+i.ToString());subId=myEnm.Value.ToString();
if(rbl.SelectedIndex<0)
{index=Convert.ToString(0);}
else
{index=Convert.ToString((Convert.ToInt32(rbl.SelectedIndex))+1);}
ans=(new DB()).getAnsR(subId);
(new DB()).insertTestStudent(stuId,subId,courseId,ans,index);
}
}
}
}=================================================================
//下面是错误提示
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误:
行 241:
行 242: subId=myEnm.Value.ToString();
行 243: if(rbl.SelectedIndex<0)
行 244: {index=Convert.ToString(0);}
行 245: else
源文件: c:\inetpub\wwwroot\examonline\test.aspx.cs 行: 243 堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
examOnline.test.getXZanswers() in c:\inetpub\wwwroot\examonline\test.aspx.cs:243
examOnline.test.Button1_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\examonline\test.aspx.cs:371
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()
解决方案 »
- 如何使用Image.Save方法发送图片到socket另一端?
- 我该如何通过文本框输入关键字,查找某一目录下的复核该关键字的文本文件?
- 如何正确应用范型返回值?
- FileStream (String, FileMode, FileAccess, FileShare, Int32)最后一个参数的意思?
- Com+订阅的问题
- 如何在admin的权限下取消文件夹及其子文件的只读属性。受限制用户可以修改、删除、替换这些在admin账户下的建立的文件
- 招网站开发人员 2000/月+奖金+年底分红
- 如何让新窗口出现在父窗口的中间呀!!
- c#遍历xml怎么只显示一条记录
- 怎么注册呢???
- 很简单的问题,送分
- 有没有办法让c# 做的软件占用内存小一点!
//RadioButtonList rbl=new RadioButtonList();
//rbl.ID="rbl"+i.ToString();
//这里我跟踪的时候发现rbl为空
RadioButtonList rbl = (RadioButtonList)this.Panel1.FindControl("rbtnlist"+i.ToString());
这种动态控件在!Page.IsPostBack后,以前添加的就会都释放掉,所以rbl查的时候为空。
只要把页面前面的if (!Page.IsPostBack)去掉,就ok了
楼主可以试一下。
{
for (int i = 0; i < child.Controls.Count; i++)
{
Control ctr = child.Controls[i];
if (ctr.Tag != null)
{
if (ctr.Tag.ToString() == CtrName)
ctr.Enabled = false;
}
if (ctr.HasChildren)
{
Contr(ctr, CtrName);
}
}
}