远程教育系统总结
在线答题模块遇见的问题及解决方式:
怎样解决在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值,即可。这样就可以了,
看来attributes真是好用啊!
怎样判断当前textbox提交数据为空?
Microsoft.VisualBasic..CompilerServices中有一个Stringtype类,里面有个strcmp函数很好用。
直接这样:if(StringType.StrCmp(TextBox2.Text,"",false)!=0)就可以了![Smile](http://localhost:99/emoticons/emotion-1.gif)
在设计中,我使用了企业程序库及dotnetnuke里面的封装数据到实体类的方法。
封装如下:
封装多个实体:
public static IDataReader GetAllQuestion()
{
return (IDataReader)SqlHelper.ExecuteReader(ConnectionString, dbo + "GetAllQuestion");
}
public ArrayList GetAllQuestion()
{
return CBO.FillCollection( SqlDataProvider.GetAllQuestion(),typeof(QInfor));
}
封装单个实体
在搜索模块里,碰见的问题有:
怎样反射一个类?代码如下:
现在可以动态获取实体类,如用户选择主题搜索,我们就可以创建主题类,即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。
好了,大功告成,我还做了一个类框架图,有空看看!
怎样解决在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](http://localhost:99/emoticons/emotion-2.gif)
怎样判断当前textbox提交数据为空?
Microsoft.VisualBasic..CompilerServices中有一个Stringtype类,里面有个strcmp函数很好用。
直接这样:if(StringType.StrCmp(TextBox2.Text,"",false)!=0)就可以了
![Smile](http://localhost:99/emoticons/emotion-1.gif)
在设计中,我使用了企业程序库及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));
}
{
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;
}
{
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文件数据如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
设置实体类中的变量值为:
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();
}
{
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();
}