線上答題模組遇見的問題及解決方式:
怎樣解決在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)就可以了
在設計中,我使用了企業程式庫及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();
}