يقوم هذا الكود بعرض اسئلة باستخدام ال repeater وكذلك عرض الاجوبة لكل سؤال
إضافة الى استخلاص اجوبة المتسابقين واختيار الفائز منهم.
الادوات المستخدمة:
1. VS 2005
2. Sql server 2005
في البداية ساقوم بشرح الجداول المستخدمه لدينا.. وهي كالتالي:
1 . question
2 . answers
3 . users
كما هو واضح من الجداول فالعلاقة بين الجدولين question وanswers هي علاقة oneToMany اي ان كل سؤال يقابله اكثر من اجابة وكل اجابه يقابلها سؤال واحد... بالنسبة للاعمده فهي بالشكل التالي:
question:
questionID , questionText
answers:
answetID , questionID , answerText , answerStatus
users:
userID , userResult , userName , UserEmail
اعتقد ان الجداول واضحه ولن تحتاج الى الكثير من الشرح خصوصا بعد الدخول في الكود.
نبدا بسم الله:
في البداية وكما هو معلوم انالوظيفة الاساسيه للrepeater هي التكرار
ونحن هنا بصدد تكرار الاسئلة والاجوبه الموجوده في قاعدة بيانات , ولهذا فان افضل طريقة لذلك هي استخدام SqlDataSource يقوم باستدعاء الاسئلة والاجوبة ووضعها في الrepeater كما في الشكل التالي:
< asp:SqlDataSource ID = "sdsQuestions" runat = "server" ConnectionString = " < % $ ConnectionStrings:QandAdbConnectionString % > " SelectCommand = "SELECT [questionID] , [questionText] FROM [questions]" > < /asp:SqlDataSource >
ومن المهم قبل ان انسا ذلك ان نحتفظ بالquestionID لنجلب الاجوبة التابعة لكل سؤال على حده ..
نقوم بالبداية بانشاء الRepeater بالشكل التالي:
< table border = "0" cellpadding = "0" cellspacing = "0" width = "90 % " >
< asp:Repeater ID = "rptQandA" runat = "server" DataSourceID = "sdsQuestions" >
< ItemTemplate >
< tr >
< td class = "question" dir = "ltr" align = "left" >
< br / >
< % #DataBinder.Eval(Container.DataItem , ("questionText")) % >
< asp:HiddenField ID = "hdnQuestionID" runat = "server" Value = ' < % #Eval("questionID") % > ' / >
< /td >
< /tr >
< /ItemTemplate >
< /asp:Repeater >
< /table >كما يتضح فانني اقوم بحفظ قيمة الquestionID باستخدام HiddenField وذلك لغرض الاستعلام عن الاجوبة التابعة للسؤال.
بعد جلب الاسئلة نقوم باضافة SqlDataSource جديد لجلب الاجوبة وسيكون من داخل الrepeater بالشكل التالي:
< asp:SqlDataSource ID = "sdsAnswers" runat = "server" ConnectionString = " < % $ ConnectionStrings:QandAdbConnectionString % > " SelectCommand = "SELECT [answerText] , [answerID] , [answerStatus] FROM [Answer] WHERE ([questionID] = @questionID)" > < SelectParameters > < asp:ControlParameter ControlID = "hdnQuestionID" Name = "questionID" PropertyName = "Value" Type = "Decimal" / > < /SelectParameters > < /asp:SqlDataSource >
وفي نهاية المطاف عرض الاجوبة سيكون باستخدام RadioButtonList بالشكل التالي:
< tr > < td class = "answer" dir = "ltr" align = "left" > < asp:RadioButtonList ID = "rblAnswers" runat = "server" DataSourceID = "sdsAnswers" DataTextField = "answerText" DataValueField = "answerID" > < /asp:RadioButtonList > < /td > < /tr >
وبذلك نكون قد قمنا بعرض الاسئلة الواحد تلو الاخر متبوعة باجابتها وبدون الدخول الى الكود نهائيا ..
الخطوة التالية هي حفظ اجوبة المشاركين..
ولذلك يجب ان نقوم بالخطوات التالية:
1.نضيف Button خارج الrepeater
2.نضيف ايضا HiddenField نسمية hdnAnswerID.
3.نضيف SqlDataSource جديد يكون على النحو التالي:
< asp:SqlDataSource ID = "SqlDataSource1" runat = "server" ConnectionString = " < % $ ConnectionStrings:QandAdbConnectionString % > " SelectCommand = "SELECT [answerStatus] FROM [Answer] WHERE ([answerID] = @answerID)" > < SelectParameters > < asp:ControlParameter ControlID = "hdnAnswerID" Name = "answerID" PropertyName = "Value" Type = "Decimal" / > < /SelectParameters >
ومن خلال ال Button نقوم بالكود التالي :
protected void Button1_Click(object sender , EventArgs e)
{
int correctAnswers = 0;
int UserID = UserID; \\نقوم بجلب ال UserID بطريقة او باخرى
foreach (RepeaterItem Items in rptQandA.Items)
{
RadioButtonList rblAnswers = (RadioButtonList)Items.FindControl("rblAnswers");
hdnAnswerID.Value = rblAnswers.SelectedItem.Value;
DataView dvwAnswerStatus = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
String answerStatus = dvwAnswerStatus.Table.Rows[0].ItemArray[0].ToString();
if (answerStatus)
correctAnswers + = 1;
}
SqlDataSource1.InsertCommand = "INSERT INTO dbo.UserResults(EmployeeID , CurrectAnswers VALUES ( ' " + EmpID + " ' , " + correctAnswers + ")";
SqlDataSource1.Insert();
}وبذلك يكون قد تم حفظ عدد الاجابات الصحيحة لكل متسابق
بنفس الاسلوب نستطيع عمل موقع استبيانات وساقوم بوضع كوده قريبا كاملا مع كود عملية الاضافة
هذا مالدي احببت ان اشارككم اياه وللمعلوميه فانها المرة الاولى التي اكتب فيها عن كود معين
قد قلت ماقلت ان كان صوابا فمن الله وحده وان كان خطا فمن نفسي والشيطان
ختاما ارجو ان لا تبخلوا علي بارائكم باسلوب الكتابة والكود
تحياتي
منصور الحمود