整个页面的思路如下:
我想先将数据库中的选择题添加到页面中显示出来.使用动态添加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() 

解决方案 »

  1.   

    page_load后动态生成的话,用findcontrol是找不到的.一些控件里再增加自定义控件(如datagrid里增加control),无论是在起初始化前还是后,都是找不到的(血泪史啊...以前看资料说在初始化前加就没问题,结果还是找不到).我的处理方法是;换思路换方法做...仅供参考... - -
      

  2.   

    试下:
    //RadioButtonList rbl=new RadioButtonList();
    //rbl.ID="rbl"+i.ToString();
    //这里我跟踪的时候发现rbl为空
    RadioButtonList rbl = (RadioButtonList)this.Panel1.FindControl("rbtnlist"+i.ToString());
      

  3.   

    同遇到这个问题,查了很久,终于解决。
    这种动态控件在!Page.IsPostBack后,以前添加的就会都释放掉,所以rbl查的时候为空。
    只要把页面前面的if (!Page.IsPostBack)去掉,就ok了
    楼主可以试一下。
      

  4.   

     private void Contr(Control child, string CtrName)
            {
                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);
                    }
                }
            }