远程教育系统总结

在线答题模块遇见的问题及解决方式:
怎样解决在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文件数据如下:
None.gif    < appSettings >
None.gif    
< add  key ="SearchKecheng"  value ="SearchKecheng" ></ add >
None.gif    
< add  key ="Searchjiangshi"  value ="Searchjiangshi" ></ add >
None.gif    
< add  key ="Searchzhuti"  value ="Searchzhuti" ></ add >
None.gif  
</ 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();
    } 

转载于:https://www.cnblogs.com/yaoguobiao/archive/2006/04/05/367811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值