سلام علیکم
ابتدا توسط کد زیر اعدادی تصادفی به تعداد سوالاتی که باید از لیست کل سوالات حذف شود ، تولید میکنیم :
if (!IsPostBack && Session["no_ref"] == "0")
{
Random rnd_num = newRandom();
bool f = false;
for (int i = 1; i <= count_qst_for_trm - count_qst; i++)
{
int num_rnd = rnd_num.Next(0, count_qst_for_trm);
for (int j = 1; j <= i; j++)
{
f = false;
if (Convert.ToInt32(Session["ar_num" + j]) == num_rnd)
{
f = true;
i = i - 1;
break;
}
}
if (f == false)
{
Session["ar_num" + i] = num_rnd;
}
}
}
با کد زیر کل سوالات مربوطه را واکشی مکنیم :
sql_da.SelectCommand.Parameters.Clear();
sql_da.SelectCommand.CommandText = "sp_sel_qst_for_trm";
sql_da.SelectCommand.Parameters.AddWithValue("@crsid", Session["crsid"].ToString().Trim());
sql_conn.Open();
sql_da.Fill(ds, "sel_qst");
sql_conn.Close();
با کد زیر به همان تعدادی که عدد تولید شد ، با استفاده از عدد تولید شده که در
Session["ar_num" + i]
قرار دارد به رکورد مورد نظر میرویم و آن را خذف می کنیم و session مربوط رو هم برابر صفر قرار میدهیم :
for (int i = 1; i <= count_qst_for_trm - count_qst; i++)
{
ds.Tables["sel_qst"].Rows[Convert.ToInt32(Session["ar_num" + i])].Delete();
Session["current_ans" + Session["ar_num" + i]] = 0;
}
حالا با کارهای انجام شده ما یک سری سوال داریم به تعداد مشخص شده توسط استاد برای امتحان مورد نظر که تعداد ضلفی آن بصورت تصادفی خذف شده است.
من ابتدا کل سولات را واکشی کردم و بعد بصورت تصادفی از درونش پاک کردم و این روش رو ترجیح دادم به اینکه بخواهم از همان ابتدا سوالات رو بصورت تصادفی واکشی کنم.
حالا بریم سر اصل مطلب که session
Session["current_ans" + i]
برای چه کاری است ؟
این session جواب سوال متناظر خود در ds را نگهداری می کند مثلا
Session["current_ans1"] جواب سوالی که در رکورد یک(1) از ds رو در خود ذخیره میکند.
و استفاده آن هنگامی است که می خواهیم نتیجه امتحان رو حساب کنیم توسط کد زیر :
protectedvoid btn_res_Click(object sender, EventArgs e)
{
grd_qst.Enabled = false;
RadioButtonList rdbl = newRadioButtonList();
for (int i = 0; i <= grd_qst.Rows.Count - 1; i++)
{
rdbl = (RadioButtonList)grd_qst.Rows[i].FindControl("ans");
if (rdbl.SelectedIndex >= 0)
{
int ansed = Convert.ToInt32(rdbl.SelectedValue);
for (int j = 0; j <= count_qst_for_trm - 1; j++)
{
if (Session["current_ans" + j].ToString() != "0")
{
if(ansed == Convert.ToInt32(Session["current_ans" + j].ToString()))
count_ans_currect += 1;
else
count_ans_incurrect += 1;
Session["current_ans" + j] = "0";
break;
}
}
}
else
count_asn_without += 1;
}
/////////////////////////////////////////////////////////////////////
sql_da.SelectCommand.Parameters.Clear();
sql_da.SelectCommand.CommandText = "sp_sel_max_eid";
sql_da.SelectCommand.Parameters.AddWithValue("@usr", Session["usr"].ToString());
sql_conn.Open();
sql_da.Fill(ds, "tbl_max");
sql_conn.Close();
//////////////////////////////////////////
sql_da.SelectCommand.Parameters.Clear();
sql_da.SelectCommand.CommandText = "sp_upd_cnt_trm";
sql_da.SelectCommand.Parameters.AddWithValue("@eid", Convert.ToInt32(ds.Tables["tbl_max"].Rows[0].ItemArray[0].ToString()));
sql_da.SelectCommand.Parameters.AddWithValue("@grade", ((((count_ans_currect * 3) - count_ans_incurrect) * 100) / ((count_asn_without + count_ans_incurrect + count_ans_currect) * 3)));
sql_da.SelectCommand.Parameters.AddWithValue("@cans", count_ans_currect);
sql_da.SelectCommand.Parameters.AddWithValue("@icans", count_ans_incurrect);
sql_da.SelectCommand.Parameters.AddWithValue("@woans",count_asn_without);
sql_da.SelectCommand.Parameters.AddWithValue("@type", "پایان ترم");
sql_conn.Open();
sql_da.Fill(ds);
sql_conn.Close();
ds.Clear();
Panel1.Visible = true;
lbl_cans.Text = count_ans_currect.ToString();
lbl_icans.Text = count_ans_incurrect.ToString();
lbl_woans.Text = count_asn_without.ToString();
lbl_res.Text = Convert.ToString(((((count_ans_currect * 3) - count_ans_incurrect) * 100) / ((count_asn_without + count_ans_incurrect + count_ans_currect) * 3)));
}
موفق باشید.
یا علی.