远程教育系统总结

在线答题模块遇见的问题及解决方式:
怎样解决在DataList中动态绑定RadioButtonList?
必须获取datalist中每一datalistitem绑定的QuestionID,这样才可以根据Questionid再次从数据库中取出问题的options,该怎么取呢?

<%# zhixia.TestOnline.Global.CopyInt(ref i,Eval("QuestionID").ToString())%>
再页面中声明一个变量I,再页面中使他获取<%# Eval("QuestionID")%>的值。
然后再DATALIST_itemDataBound()事件中使用变量I即可。
也可以使用 int qid = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);获取datakey的值,而我们把datakey已设为QuestionID。
Questionid已取出,我们可以调用controller里面的方法获取数据,然后绑定即可。


怎样判断答题是否正确?
必须获取用户选择了哪个选项与正确答案是哪个,即获取radiobuttonList的selectindex及获取当前item的answer值。获取radiobuttonlist的值很好办,如果用户触发selectindexchanged事件,即可从触发对象中获取,而answer值该怎么取呢?
想来想去,终于想出可以再datalistitemdatabound事件中,把answer值放入radionbuttonlist的attributes 中存储,然后再selectindexchanged事件中,获取触发事件的当前对象并同时获取attribute值,即可。这样就可以了,Big Smile看来attributes真是好用啊!

怎样判断当前textbox提交数据为空?
Microsoft.VisualBasic..CompilerServices中有一个Stringtype类,里面有个strcmp函数很好用。
直接这样:if(StringType.StrCmp(TextBox2.Text,"",false)!=0)就可以了Smile

在设计中,我使用了企业程序库及dotnetnuke里面的封装数据到实体类的方法。
封装如下:
封装多个实体:
     
        
public static IDataReader GetAllQuestion()
        {
            
return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, dbo + "GetAllQuestion");
        }
        
public ArrayList GetAllQuestion()
        {
            
return CBO.FillCollection( SqlDataProvider.GetAllQuestion(),typeof(QInfor));   
        }

封装单个实体

         public static IDataReader GetQuestion(int QuestionID)
        {
            
return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, dbo + "GetQuestion", QuestionID );
        }
        
public QInfor GetQuestion(int QuestionID)
        {
            
return (QInfor)CBO.FillObject(SqlDataProvider.GetQuestion(QuestionID), typeof(QInfor));
        }




在搜索模块里,碰见的问题有:
怎样反射一个类?代码如下:

  public static ASearch MakeSearch(string style, string key)
    {
        ASearch asearch 
= null;
        
try
        {
//获取搜索类型,如style=主题,就创建主题搜索实体类,及ZSearch类。key为搜索关键字
            Type type = Type.GetType(style, true);
            Guid g 
= type.GUID;
            
object[] para=new object[]{key};
//创建实体类,并提供para参数初始化实体类即ZSearch类,我原以为这里会初始化抽象函数,原来没有!
            asearch = (ASearch)Activator.CreateInstance(type, para);
            
return asearch;
        }
        
catch (TypeLoadException ex)
        {
            System.Console.Write(ex);
        }
        
return asearch;
    }




现在可以动态获取实体类,如用户选择主题搜索,我们就可以创建主题类,即ZSearch 类。但搜索数据需调用相应的存储过程,我们不可能把存储过程名写入程序中,这样就失去了灵活性,这样也就失去了工厂模式的意义,突然,我想到了config配置文件的使用,我们可以动态调用config文件里的存储过程名称,这样就可以达到目的。我们又怎样去调用存储过程呢?
config文件数据如下:
  <appSettings>
    
<add key="SearchKecheng" value="SearchKecheng"></add>
    
<add key="Searchjiangshi" value="Searchjiangshi"></add>
    
<add key="Searchzhuti" value="Searchzhuti"></add>
  
</appSettings>


设置实体类中的变量值为:
public string _sps = ConfigurationManager.AppSettings["Searchjiangshi"];

这样如果我们要增加新的一种搜索方式可以添加:
比如“搜索所有项”
一个存储过程,SearchAll
一个类AllSearch 继承ASearch抽象类。
在index。aspx的dropdownlist控件中增加一项“所有”,并设置value为“SearchAll”,
值得注意的是:value值必须与类实体名称一致,不然就会exception。
好了,大功告成,我还做了一个类框架图,有空看看!
protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        RadioButtonList rbl 
= (RadioButtonList)e.Item.FindControl("RadioButtonList1");
        
//int qid = i;
        int qid = Convert.ToInt32(DataList1.DataKeys[e.Item.ItemIndex]);
        
//rbl.Attributes["answer"] = answer;
        rbl.Attributes["answer"= DataBinder.Eval(e.Item.DataItem, "answer").ToString();
        rbl.Attributes[
"QuestionID"= Convert.ToString( qid);

        QOpController qc 
= new QOpController();
        rbl.DataSource 
= qc.GetOption(qid);
        rbl.DataBind();
    } 
posted on 2006-04-05 21:01  Sunny  阅读(418)  评论(0编辑  收藏  举报