PDA

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



012132
پنج شنبه 26 تیر 1393, 21:34 عصر
من توی برنامم یک دیتاگرید دارم که توش یک ستون ID دارم که مقادیرش رو کاربر میتونه حذف و اضافه کنه . پس مقادیرش ایستا نیست .
می خوام از بین ID ها ، 5 تاش رو هر دفعه بطور تصادفی انتخاب و اطلاعات دیگر ستونها رو توی یک data tabel ، ذخیره کنه .
چطور بایست این کار رو انجام بدم ؟؟ اگه نیاز هست بیشتر توضیح بدم

Mahmoud.Afrad
جمعه 27 تیر 1393, 01:41 صبح
5 سطر رو به صورت تصادفی میخوای انتخاب کنی؟
سوالت تکراریه! ولی راهنمایی اینکه یک guid هم سلکت کنید بعد براساس همین guid مرتب و بعد 5 تا رو انتخاب کنید.

012132
جمعه 27 تیر 1393, 13:12 عصر
من با دستور زیر ، از بین ستون ID جدول اول ، هر دفعه یک عدد رندم تولید می کنم .
اومدم شرط گذاشتم که اگه ID تولید شده با ID جدول 2 برابر نبود ، Insert انجام بده اما هر دفعه یه عدد تکراری ایجاد میشه . مشکل از کجاست ؟
اینم کد :


Random rnd = new Random();
int dg1_row, dg1_id, dg2_id;


for (int i = 0; i < 20; i++)
{
dg1_row = rnd.Next(0, dataGridView1.Rows.Count);
dg1_id = int.Parse(dataGridView1.Rows[dg1_row].Cells["ID"].Value.ToString());

for (int j = 0; j < dataGridView2.Rows.Count; j++)
{
int dg2_id = int.Parse(dataGridView2.Rows[j].Cells["ID"].Value.ToString());


if (dg1_id != dg2_id)
{
//tbl_azmoonTableAdapter1.Insert_Azmoon(int.Parse(da taGridView1.Rows[dg1_row].Cells["ID"].Value.ToString()), dataGridView1.Rows[dg1_row].Cells["QST_Text"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_A"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_B"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_C"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_D"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_PIC"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_Pic_A"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_Pic_B"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_Pic_C"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["QST_Pic_D"].Value.ToString(), dataGridView1.Rows[dg1_row].Cells["Answer"].Value.ToString());
}
else
{
MessageBox.Show(dg1_id.ToString() + "\n\n" + dg2_id.ToString());
i--;

}
}

Mahmoud.Afrad
جمعه 27 تیر 1393, 13:17 عصر
سوالت اصلا واضح نیست.

012132
جمعه 27 تیر 1393, 13:23 عصر
دوست عزیز من دو تا دیتاگرید دارم ، اولی یک دارای یکسری اطلاعات هست که یکی از فیلدهاش فیلد ID . من با استفاده از تابع random و حلقه for میام تا 20 عدد بصورت رندم ، از مقدار ستون ID ایجاد میکنم و توی دیتاگرید دومی میریزم . تو کد بالا هم نوشتم قسمت اول سوال یعنی تولید عدد رندم از ستون ID دیتاگرید رو بخوبی انجام میدم . فقط مشکلی که هست اینه که نمی خوام این اعداد تولید شده تکراری باشد . توی بخش دوم کد بالا (توی for دوم) می خوام عدد تولید شده رو با اعداد ذخیره شده در دیتاگرید دوم مقایسه کنم و ببینم که آیا این عددی که الان تولید شده آیا از قبل داخل دیتاگرید دوم بوده یا خیر . اگر نبوده به دیتاگرید اضافه کنه و اگر بوده که کاری انجام نده . مشکل من فقط قسمت مقایسه هست که کار نمیکنه .
لطفاً راهنماییم کنید که برای انجام این مقایسه چیکار بایست بکنم ؟؟!!

Mahmoud.Afrad
جمعه 27 تیر 1393, 13:44 عصر
اگر قراره این عددهای رندوم به عنوان کلیداصلی در دیتابیس درج بشن ، مسئله مهمتری برات بوجود میاد و اون هم اینه که نباید این عددها قبلا در جدول درج شده باشه.
در مورد ایجاد عدد رندوم غیرتکراری تاپیک های زیادی قبلا ایجاد شده میتونی استفاده کنی.


اینکه من میگم سوالت واضح نیست یعنی اینکه میخوام بدونم منظورت از ایجاد این اعداد رندوم چیه و چه نیازی بهشون داری؟ روند کاری که میخوای انجام بدی رو توضیح بده.

012132
جمعه 27 تیر 1393, 13:54 عصر
دوست عزیز من یه پروژه دارم مینویسم که توش یه قسمت آزمون داره . مدیر میاد و مشخص می کنه که نوع آزمون به صورت رندوم باشه یا اینکه سوالات رو خودش انتخاب میکنه .
در نوع سوالات رندم می خوام از بانک سوالاتی که قبلاً ایجاد کردم ، بصورت رندم ID سوالات را از دیتاگرید بخونم و داخل یه جدول دیگه بریزم و نمی خوام این ID هایی که توی جدول دوم میریزم تکراری باشه (نمی خوام سوالاتم تیو آزمون تکرار بشه) . حالا بخاطر همین من دو تا دیتاگرید گرفتم . دیتاگرید اول از بانک سوالات میخونه و دیتاگرید دوم هم از سوالات رندم میخونه . بعد اینکه دکمه آزمون تصادفی رو انتخاب کردم میام از جدول بانک سوالات ، از ستون IDش 20 تا عدد بصورت تصادفی برمیدارم و توی جدول آزمون رندم میریزم . حالا مشکلی که هست اینه که وقتی بصورت تصادفی ID ها رو از جدول بانک سوالات میگیرم ، یک سری ID تکرار میشه . می خوام وقتی که بطور تصادفی عدد میخواد برداره چک کنه و ببینه که آیا عدد از قبل توی جدول آزمون تصادفی بوده یا نه . اگه بوده که ID رو که انتخاب کرده ثبت نکنه و یه ID دیگه رو بگیره و اگه هم که ID که الان گرفته از قبل وجود نداشته ، اینو توی جدول آزمون تصادفی ثبتش کنه همین .
تاپیک های دیگه رو هم دیدم ولی زیاد متوجه نشدم .

Mahmoud.Afrad
جمعه 27 تیر 1393, 14:20 عصر
خب حالا این شد سوال با توضیح کامل!!

دو تا راه داری یکی اینکه بی خیال دیتاگرید بشی و توسط کوئری sql سوالات رو به صورت رندوم دریافت کنی.
راه دوم اینه که از همون دو تا دیتاگرید استفاده کنی. یک راه خیلی خوب اینه که آیدی سوالات منبع (همه سوالاتی که میتونن انتخاب بشن)رو بریزی توی یک مجموعه و تا حد ممکن این مجموعه رو به هم بزنی (محتوای خانه های این مجموعه رو دو تا دوتا با هم عوض کنی) پس از این کار یک مجموعه داری که به قدر کافی به هم خورده و ترتیب نداره. حالا کافیه از ابتدا یا انتها یا هر جایی از مجموعه به تعداد مثلا 20 تا سوال رو انتخاب کنی.
این توضیحات فارسیش بود.

کد؛
راه اول :برای دریافت از دیتابیس به صورت رندوم: مثلا میخواهیم یک آزمون 20 سوالی از جدول سوالات بسازیم. ابتدا سوالات رو برحسب یک guid مرتب میکنیم و 20 تا ازش میگیریم:

select top(20)
NEWID() as rnd,
tbl.id
from tbl
order by rnd

کافیه آیدی های انتخابی همراه با آیدی آزمون در جدول آزمون ثبت بشن. (این کار رو بلافاصله در sql میتونی انجام بدی)

راه دوم : لینک زیر کدش رو نوشتم.
http://barnamenevis.org/showthread.php?394935&p=1751979&viewfull=1#post1751979