PDA

View Full Version : عدم تکرار نتیجه سلکتها



sm_ezadpanah
یک شنبه 28 مرداد 1386, 15:58 عصر
اگه چندتا سلکت از بانک(از یک جدول) به صورت زیر داشته باشیم :
da = new OleDbDataAdapter(strcon + " and sal='"+msal+"'", con);
da.Fill(ds, "maxk");
l1.DataBindings.Add("text", ds, "maxk.test");
radioButton1.DataBindings.Add("text", ds, "maxk.g1");
radioButton2.DataBindings.Add("text", ds, "maxk.g2");
radioButton3.DataBindings.Add("text", ds, "maxk.g3");
radioButton4.DataBindings.Add("text", ds, "maxk.g4");
label21.DataBindings.Add("text", ds, "maxk.ans");// javab soal
ansb[1] = Convert.ToInt32(label21.Text );
label21.DataBindings.Clear();

da = new OleDbDataAdapter(strcon + " and sal='" + msal + "'", con);
da.Fill(ds, "maxk1");
l2.DataBindings.Add("text", ds, "maxk1.test");
radioButton5.DataBindings.Add("text", ds, "maxk1.g1");
radioButton6.DataBindings.Add("text", ds, "maxk1.g2");
radioButton7.DataBindings.Add("text", ds, "maxk1.g3");
radioButton8.DataBindings.Add("text", ds, "maxk1.g4");
label21.DataBindings.Add("text", ds, "maxk1.ans");// javab soal
ansb[2] = Convert.ToInt32(label21.Text);
label21.DataBindings.Clear();
باتوجه به اینکه ازیک جدول هستند چه جوری میتونیم تو هربار بگیم جوری سلکت بشه که تو سلکت قبلی نباشه .یعنی مثلا خروجی سلکت سوم همون خروجی دومی نباشه

PC2st
یک شنبه 28 مرداد 1386, 16:17 عصر
به نظرم میخواید یک فرم سوال - جواب درست کنید.

اگر اینطور باشه و میخواید یک فرم سوال-جواب باشه، لازم نیست که تک تک سوالها یا جوابها رو به تک تک RadioButton ها وصل کنید، منظورم اینه که در کد شما، کدهای زیر اضافی هستند:


da = new OleDbDataAdapter(strcon + " and sal='" + msal + "'", con);
da.Fill(ds, "maxk1");
l2.DataBindings.Add("text", ds, "maxk1.test");
radioButton5.DataBindings.Add("text", ds, "maxk1.g1");
radioButton6.DataBindings.Add("text", ds, "maxk1.g2");
radioButton7.DataBindings.Add("text", ds, "maxk1.g3");
radioButton8.DataBindings.Add("text", ds, "maxk1.g4");
label21.DataBindings.Add("text", ds, "maxk1.ans");// javab soal
ansb[2] = Convert.ToInt32(label21.Text);
label21.DataBindings.Clear();


هر وقت که کاربر به سوال فعلی، جواب درست داد، سوال بعد را بکمک دستور زیر به او نمایش دهید:


radioButton1.DataBindings[0].BindingManagerBase.Position++;

چون radioButton1 و radioButton2 و ... و radioButton4 به دیتاست متصل شده اند، پس با دستور بالا، همه آنها به رکورد بعدی که همان گزینه های بعدی هستند، خواهند شد. البته l1 اگر متن سوال باشه، اون هم آپدیت میشه.

امیدوارم درست متوجه شدم که میخواید چه کار کنید!

sm_ezadpanah
یک شنبه 28 مرداد 1386, 16:25 عصر
با سلام
خوب من می خوام مثلا تو یه فرم 10 سوال رو کاربر ببینه و به هرکوم خواست جواب بده نه اینکه
هر وقت که کاربر به سوال فعلی، جواب درست داد، حالا بعد بهش سوال بعد رونشون بده

PC2st
یک شنبه 28 مرداد 1386, 16:54 عصر
بخاطر تکمیل کردن توضیحات ممنونم.

پس بر اساس این توضیحات، radioButton ها و متن سوال و ... بهتره که به شیئ DataSet متصل نباشند، بلکه پس از به نمایش گذاشتن پرسش و گرفتن پاسخ از کاربر، برای نمایش 10 سوال بعدی، اطلاعات رو از دیتاست بخونید و درون radioButton ها و غیره، قرار بدید.

مثلا بجای bind کردن radioButton1، مقدار فیلد از رکورد iii را در متن آن قرار دهید:


radioButton1.Text = (string)ds.Tables["maxk"].Rows[iii]["g1"];
radioButton2.Text = (string)ds.Tables["maxk"].Rows[iii]["g2"];
radioButton3.Text = (string)ds.Tables["maxk"].Rows[iii]["g3"];
radioButton4.Text = (string)ds.Tables["maxk"].Rows[iii]["g4"];

و مثلا برای سوالات بعدی که کاربر یکی از اینها رو لازمه که جواب بده:


radioButton5.Text = (string)ds.Tables["maxk"].Rows[iii + 1]["g5"];
radioButton6.Text = (string)ds.Tables["maxk"].Rows[iii + 1]["g6"];
radioButton7.Text = (string)ds.Tables["maxk"].Rows[iii + 1]["g7"];
radioButton8.Text = (string)ds.Tables["maxk"].Rows[iii + 1]["g8"];

که رکورد دوم که مال سوال و جوابهای دوم است، در بقیه radioButton ها ذخیره میشه، این عمل تکرار میشه تا 10 سوال رو به کاربر نمایش بدیم.

متغیر iii میتونه یک شیئ از نوع عدد و بصورت عمومی (private field) باشه که بعد از دریافت پاسخ از کاربر و گرفتن مثلا 10 سوال بعدی، باید 10 تا به مقدار آن اضافه بشه.

البته این کدهائی که نوشتم برای radioButton ها بود، برای متن سوالها هم همین کار رو میکنیم.

sm_ezadpanah
دوشنبه 29 مرداد 1386, 10:28 صبح
با سلام
دوست عزیز از راهنماییتون نهایت سپاس رو دارم . فقط یک سوال؟ داده های داخل دیتا ست بر چه اساسی مرتب می شن و چه جوری میتونیم رکوردها رو ر اساس یه فیلد خاص مرتبشون کرد. من در آخر رشته سلکتم از order by استفاده کردم اما بازم براساس همون فیلدی که اول مرتب کرده بود مرتب می کنه .

PC2st
دوشنبه 29 مرداد 1386, 11:47 صبح
من در آخر رشته سلکتم از order by استفاده کردم
اگر از order by در SELECT استفاده کردید، باید مرتب بشه، (که این راه مناسبه)

بهرحال اگر بخواید عمل مرتب کردن رو از طریق دیتاست انجام بدید:


ds.Tables["maxk"].DefaultView.Sort = "test";

کد فوق، دیتاست رو بر اساس فیلد test (که فکر کنم فیلد متن سوال باشه) مرتب میکنه.
اما چون radioButton ها به دیتاست Bind نیستند، پس خودتون باید از DefaultView استفاده کنید (در غیر اینصورت، خود radioButton ها از DefaultView استفاده می کردند)، مثلا:


radioButton1.Text = (string)ds.Tables["maxk"].DefaultView[iii]["g1"];

sm_ezadpanah
دوشنبه 29 مرداد 1386, 12:18 عصر
با سلام
دوست عزیز شماره رکورد اول دیتا ست صفر یا یک؟ فکر میکنم صفر باشه . اآخه اون رکوردایی که دیتاست من استخراج میکنه همشون اون سورتینگ رو دارن (یعنی همون جوری که انتظار دارم استخراج میشن ) اما جای رکورد اولی و دومی جابه جاست (یعنی رکورد صفرم و یکم )

sm_ezadpanah
دوشنبه 29 مرداد 1386, 12:44 عصر
با سلام
راستی جالبه که وقتی بر اساس فیلد test عمل order by رو انجام میدم نتیجه درسته و لی وقتی براساس id عمل order by انجام میشه نتیجه درست نیست

PC2st
دوشنبه 29 مرداد 1386, 13:49 عصر
دوست عزیز شماره رکورد اول دیتا ست صفر یا یک؟ فکر میکنم صفر باشه .
درسته، ایندکس رکورد اول صفر است.


اما جای رکورد اولی و دومی جابه جاست (یعنی رکورد صفرم و یکم )
نباید همچنین حالتی پیش بیاد، این فیلدها برای رکوردهای اول و دوم چه مقداری دارند؟
شاید یکی از اینها، قبلش یک space کوچولو وجود داشته باشه؟

sm_ezadpanah
دوشنبه 29 مرداد 1386, 14:11 عصر
با سلام

شاید یکی از اینها، قبلش یک space کوچولو وجود داشته باشه؟آخه داخل بانک وقتی بر اساس فیلد id سورت می کنم نتیجه درسته . اما تو برنامه جای رکورد اول و دوم و هفتم و هشتم برعکسه . ولی خوب اشکالی نداره بر اساس همون test عمل oreder by رو انجام میدم . فقط یه سوال
اگه بخوام هر دفعه که کاربر میاد و میره به قسمت آزمون سوالات متفاوتی ببینه چه کار باید کنم ؟

PC2st
دوشنبه 29 مرداد 1386, 15:16 عصر
به مثال زیر نگاه کنید، که داده های یک شیئ از List رو بصورت random و غیر تکراری در یک listBox1 قرار میدهد:


List<int> lst = new List<int>();

for (int i = 10; i <= 20; i++)
lst.Add(i);

Random rnd = new Random();
int rand;
int count = lst.Count;

for (int i = 0; i < count; i++)
{
rand = rnd.Next(0, count - i - 1);
listBox1.Items.Add(lst[rand]);
lst.RemoveAt(rand);
}

میتوانید آی دی سوالات رو در یک همچنین لیستی قرار بدید.

sm_ezadpanah
دوشنبه 29 مرداد 1386, 15:50 عصر
با سلام
از sample که گذاشتی خیلی ممنون . در داین صورت باید برای هر سوال یک سلکت با id های ردوم بذارم .

sm_ezadpanah
دوشنبه 29 مرداد 1386, 15:52 عصر
یعنی تو لود فرم بیاد و هرسلکتی رو با id یکی از ایندکس های لیست بگیره

sm_ezadpanah
دوشنبه 29 مرداد 1386, 16:02 عصر
یعنی تو لود فرم بیاد و هرسلکتی رو با id یکی از ایندکس های لیست بگیره

PC2st
دوشنبه 29 مرداد 1386, 16:37 عصر
یعنی مثلا، اگر فیلد test مربوط به متن سوالات باشه، کدهای زیر سوالاتتون رو بصورت random و غیر تکراری درون یک listBox1 نمایش میده:


List<int> lst = new List<int>();
int count = ds.Tables[0].Rows.Count;
Random rnd = new Random();
int random;

for (int i = 0; i < count; i++)
lst.Add(i);

for (int i = 0; i < count; i++)
{
random = rnd.Next(0, count - i - 1);
listBox1.Items.Add((string)ds.Tables["maxk"].Rows[lst[random]]["test"]);
lst.RemoveAt(random);
}

شما باید بجای اینکه اونها رو به listBox1 اضافه کنید، بجاش RowIndex اون رو بردارید و متن سوال و گزینه های آن و جواب رو بدست بیارید. به این ترتیب میتوانید سوالات و جوابها رو بدست بیارید.

sm_ezadpanah
دوشنبه 29 مرداد 1386, 16:54 عصر
با سلام
ممنون از لطفتون .

sm_ezadpanah
سه شنبه 30 مرداد 1386, 11:30 صبح
با سلام
مشکلم حل شد . در آخر بعد از کمی تغییرات جهت جلوگیری از خطایی که در صورت خالی بودن سطرها (مثلا دیتا ست 5 تا رکورد بر میگردونه بعد ما مثلا رکورد 6 رو هم یه جا استفاده کردیم) رخ می ده کدش اینجوری شد.
List<int> lst = new List<int>();
for (int i = 0; i <= ds.Tables["maxk"].Rows.Count; i++)
lst.Add(i);

Random rnd = new Random();
int rand;
int count = ds.Tables["maxk"].Rows.Count;

for (int i = 0; i < 14; i++)
{
rand = rnd.Next(0, count - i - 1);
ids[i]=lst[rand];
//MessageBox.Show(Convert.ToString(ids[i]));
lst.RemoveAt(rand);
}
// پر کردن لیبل ها و غیره
if(ds.Tables["maxk"].Rows.Count>0)
{
l1.Text = (string)ds.Tables["maxk"].Rows[ids[0]]["test"];
l1.Text = l1.Text + " (" + (string)ds.Tables["maxk"].Rows[ids[0]]["sal"] + ")";
radioButton1.Text = (string)ds.Tables["maxk"].Rows[ids[0]]["g1"];
radioButton2.Text = (string)ds.Tables["maxk"].Rows[ids[0]]["g2"];
radioButton3.Text = (string)ds.Tables["maxk"].Rows[ids[0]]["g3"];
radioButton4.Text = (string)ds.Tables["maxk"].Rows[ids[0]]["g4"];
ansb[1] = Convert.ToInt32(ds.Tables["maxk"].Rows[ids[0]]["ans"]);
}
if (ds.Tables["maxk"].Rows.Count > 1)
{
l2.Text = (string)ds.Tables["maxk"].Rows[ids[1]]["test"];
l2.Text = l2.Text + " (" + (string)ds.Tables["maxk"].Rows[ids[1]]["sal"] + ")";
radioButton5.Text = (string)ds.Tables["maxk"].Rows[ids[1]]["g1"];
radioButton6.Text = (string)ds.Tables["maxk"].Rows[ids[1]]["g2"];
radioButton7.Text = (string)ds.Tables["maxk"].Rows[ids[1]]["g3"];
radioButton8.Text = (string)ds.Tables["maxk"].Rows[ids[1]]["g4"];
ansb[2] = Convert.ToInt32(ds.Tables["maxk"].Rows[ids[1]]["ans"]);
}
if (ds.Tables["maxk"].Rows.Count > 2)
{
l3.Text = (string)ds.Tables["maxk"].Rows[ids[2]]["test"];
l3.Text = l3.Text + " (" + (string)ds.Tables["maxk"].Rows[ids[2]]["sal"] + ")";
radioButton9.Text = (string)ds.Tables["maxk"].Rows[ids[2]]["g1"];
radioButton10.Text = (string)ds.Tables["maxk"].Rows[ids[2]]["g2"];
radioButton11.Text = (string)ds.Tables["maxk"].Rows[ids[2]]["g3"];
radioButton12.Text = (string)ds.Tables["maxk"].Rows[ids[2]]["g4"];
ansb[3] = Convert.ToInt32(ds.Tables["maxk"].Rows[ids[2]]["ans"]);
}