PDA

View Full Version : سوال: خطا در زمان ریختن دیتاتیبل درون گریدویو



veniz2008
جمعه 24 شهریور 1391, 18:59 عصر
سلام. من میخوام که درون هر گریدویو حدااکثر 6 رکورد داشته باشم. یعنی اگر جستجوی من ( یعنی چیزی که داخل دیتاتیبل ریختم) مثلا 8 رکورد داشت 6رکورد اول درون گرید اول و 2 رکورد آخر هم درون گرید دوم ریخته بشه. من کد زیر رو نوشتم ولی خطای مربوط به خارج از محدوده بودن ایندکس میده ( من که هرچی فکر میکنم می بینم درست مقداردهی میکنم. موقع اجرا عدد 8 درون countrecorddt قرار میگیره. حالا مشکل از کجاست نمیدونم...).
کد :

countrecorddt = DtStudent.Rows.Count;
if(countrecorddt <= 6)
GrdTotalExam1.DataSource = mystudent.DtStudent;
if (countrecorddt > 6 && countrecorddt <= 12)
{
for (int i = 0; i < 6; i++)
{
GrdTotalExam1.Rows[i].Cells["ClmExamID"].Value = DtStudent.Rows[i]["ExamID"].ToString();
GrdTotalExam1.Rows[i].Cells["ClmDateExam"].Value = DtStudent.Rows[i]["DateExam"].ToString();
}
for (int j = 0; j < countrecorddt - 6; j++)
{
GrdTotalExam2.Rows[j].Cells["ClmExamID"].Value = DtStudent.Rows[ 6 + j]["ExamID"].ToString();
GrdTotalExam2.Rows[j].Cells["ClmDateExam"].Value = DtStudent.Rows[ 6 + j]["DateExam"].ToString();
}
}
خطا (به همون خط اول مربوط به مقداردهی گرید گیر میده) :

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Arash_janusV3
جمعه 24 شهریور 1391, 20:42 عصر
درود بر شما
در کد متوجه اشکال خواهید شد

countrecorddt = DtStudent.Rows.Count;
if (countrecorddt <= 6)
GrdTotalExam1.DataSource = mystudent.DtStudent;
if (countrecorddt > 6 && countrecorddt <= 12)
{

for (int i = 0; i < 6; i++)
{
GrdTotalExam1.Rows.Add();
GrdTotalExam1.Rows[i].Cells["ClmExamID"].Value = DtStudent.Rows[i]["ExamID"].ToString();
GrdTotalExam1.Rows[i].Cells["ClmDateExam"].Value = DtStudent.Rows[i]["DateExam"].ToString();
}
for (int j = 0; j < countrecorddt - 6; j++)
{
GrdTotalExam2.Rows.Add();
GrdTotalExam2.Rows[j].Cells["ClmExamID"].Value = DtStudent.Rows[6 + j]["ExamID"].ToString();
GrdTotalExam2.Rows[j].Cells["ClmDateExam"].Value = DtStudent.Rows[6 + j]["DateExam"].ToString();
}
}


طراحی شما دارای اشکال هستش
اگر تمایل به تغییر دارید اعلام کنید تا کمکتون کنم

veniz2008
جمعه 24 شهریور 1391, 20:54 عصر
حتما. خوشحال میشم ایراد کارم رو بفهمم.

Arash_janusV3
جمعه 24 شهریور 1391, 21:02 عصر
چرا شما باید دو گرید داشته باشید
فقط برای نمایش اطلاعات کاربرد داره؟
اگر 6رکورد اول اطلاعات مهم محسوب می شوند
می توانید آنها را در یک گرید بگذارید و 6رکورد اول را با رنگ خاکستری مشخص کنید
این شیوه شما در بلند مدت مشکلاتی به همراه داره

veniz2008
جمعه 24 شهریور 1391, 21:21 عصر
من حداکثر 24 تا رکورد دارم که اولویت همشون یکسانه. درون فرمم اطلاعات دیگه ای هم دارم که امکان نمایش همه رکوردها درون یک گرید وجود نداره( میشه نمایش داد ولی زیبایی نداره). من در واقع 4 تا گرید دارم که هر گرید حداکثر میخوام 6 تا رکورد رو نمایش بده( این 4 گرید سایزشون کوچیک هست که در کنار همدیگه قرار دارند و فضای کمی رو اشغال میکنند).

veniz2008
جمعه 24 شهریور 1391, 21:24 عصر
اینم یه عکس از گریدهام تا منظورم رو بهتر متوجه بشید ( منظور از ش ،شماره آزمون هست. فیلد وضعیت یک چک باکس هست که به گرید اضافه کردم و وضعیت انتخاب شدن یا نشدن رکورد(آزمون) رو مشخص میکنه.)
92872

Arash_janusV3
جمعه 24 شهریور 1391, 21:45 عصر
شما می توانید از TreeView هم استفاده کنید
همه را در یک جا بگذارید فقط باید روش کار کنید
اما هم زیبا تر می شه و یا اینکه اینها رو در یک گرید نمایش بدید ولی به سبک زیر شاخه ای
یعنی کاربر با زدن یک علامت + در گرید می تواند جزئیات بیشتری را ببیند

veniz2008
شنبه 25 شهریور 1391, 00:42 صبح
شما می توانید از TreeView هم استفاده کنید
همه را در یک جا بگذارید فقط باید روش کار کنید
اما هم زیبا تر می شه و یا اینکه اینها رو در یک گرید نمایش بدید ولی به سبک زیر شاخه ای
یعنی کاربر با زدن یک علامت + در گرید می تواند جزئیات بیشتری را ببیند
این اون چیزی نیست که من میخوام. اگر امکان داره با همین روشی که خودم انتخاب کردم توضیح بدید. یعنی من اگر 8 تا رکورد داشته باشم چطوری میتونم 6 تای اول رو داخل گرید1 و 2 تای آخر رو درون گرید2 نمایش بدم؟.تشکر.

veniz2008
شنبه 25 شهریور 1391, 12:28 عصر
کدی رو که گذاشته بودید تست کردم. اما یه مشکل دیگه پیش میاد.من 2 تا کمبو دارم که با توجه به مقدارهای کمبوها حداکثر 24 آزمون نشون داده میشه. در مرحله اول هر 8 رکورد نمایش داده میشه. در مرحله دوم 2 رکورد میخوام نمایش داده بشه (یعنی با توجه به مقادیر کمبو ها 2 رکورد دارم. تا اینجا هیچ مشکلی نیست) ولی زمانیکه دوباره میخوام اون 8 رکورد رو نشون بدم خطای Cannot clear this list رخ میده( به خط اول بعد از if دوم گیر میده).
کدهای درون رویداد SelectedIndexChanged :

countrecorddt = DtStudent.Rows.Count;
if (countrecorddt <= 6)
{
GrdTotalExam1.DataSource = DtStudent;
GrdTotalExam2.Rows.Clear();
}
if (countrecorddt > 6 && countrecorddt <= 12)
{
GrdTotalExam1.Rows.Clear();
for (int i = 0; i < 6; i++)
{

GrdTotalExam1.Rows.Add();
GrdTotalExam1.Rows[i].Cells["ClmExamID"].Value = DtStudent.Rows[i]["ExamID"].ToString();
GrdTotalExam1.Rows[i].Cells["ClmDateExam"].Value = DtStudent.Rows[i]["DateExam"].ToString();
}
for (int j = 0; j < countrecorddt - 6; j++)
{
GrdTotalExam2.Rows.Add();
GrdTotalExam2.Rows[j].Cells["ClmExamID"].Value = DtStudent.Rows[6 + j]["ExamID"].ToString();
GrdTotalExam2.Rows[j].Cells["ClmDateExam"].Value = DtStudent.Rows[6 + j]["DateExam"].ToString();
}
}

veniz2008
شنبه 25 شهریور 1391, 16:07 عصر
دقیقا خطا در کدوم حلقه و به چه خطی گرفته میشه؟
به خط نهم یعنی GrdTotalExam1.Rows.Clear();

ehsan7007
شنبه 25 شهریور 1391, 16:17 عصر
به خط نهم یعنی GrdTotalExam1.Rows.Clear();
برای چی پاک می کنید؟
اینطوری اگه 8 رکورد داشتع باشید ، که فقط در گریددوم ، 2 رکورد نمایش داده می شه!


اگه دوازده ستون درست کنید (در یک گرید) چی؟
هر نام در سه ستون تکراربشه!
اینطوری بهتر نمی شه؟!

veniz2008
شنبه 25 شهریور 1391, 16:25 عصر
برای چی پاک می کنید؟
اینطوری اگه 8 رکورد داشتع باشید ، که فقط در گریددوم ، 2 رکورد نمایش داده می شه!


اگه دوازده ستون درست کنید (در یک گرید) چی؟
هر نام در سه ستون تکراربشه!
اینطوری بهتر نمی شه؟!
فرض کنید با توجه به مقادیر کمبوها، 8 رکورد داشته باشم (در لحظه لود شدن 8 رکورد دارم که 6 رکورد درون گرید1 و 2 رکورد هم درون گرید2). حالا کاربر مقدار کمبو رو طوری تغییر میده که خروجی میشه 2 رکورد. خوب بایستی اول سطرها رو پاک کنم بعدش بیام از نو سطر اضافه کنم. در مورد 12 ستون در گرید کار نکردم ولی اگه حتی قابل پیاده سازی باشه بازم ظاهر زیبایی نداره.

Arash_janusV3
شنبه 25 شهریور 1391, 21:06 عصر
برای حذف اطلاعات گرید از این روش می توانید استفاده کنید

GrdTotalExam1.DataSource = new DataTable();

ehsan7007
شنبه 25 شهریور 1391, 21:26 عصر
فکر می کنم اینطوری بهتر باشه چون من که می خوتستم گریدم رو پاک کنم ، با
GrdTotalExam1.Rows.Clear();
دقیقا همون خطایی رو که برای محمد جان می داد ، می گرفت.
با روش دیگه برای حذف row ها ، صددرصد مشکل ارورتون حل می شه.

موفق باشید.

veniz2008
شنبه 25 شهریور 1391, 22:00 عصر
متاسفانه حتی همون بار اول هم لود نمیشه و خطای زیر رو میده :
کدها :

countrecorddt = DtStudent.Rows.Count;
if (countrecorddt <= 6)
{
GrdTotalExam2.Rows.Clear();
GrdTotalExam1.DataSource = DtStudent;
}
if (countrecorddt > 6 && countrecorddt <= 12)
{
GrdTotalExam1.DataSource = new DataTable();
GrdTotalExam2.Rows.Clear();
for (int i = 0; i < 6; i++)
{
GrdTotalExam1.Rows.Add();
GrdTotalExam1.Rows[i].Cells["ClmExamID"].Value = DtStudent.Rows[i]["ExamID"].ToString();
GrdTotalExam1.Rows[i].Cells["ClmDateExam"].Value = DtStudent.Rows[i]["DateExam"].ToString();
}
for (int j = 0; j < countrecorddt - 6; j++)
{
GrdTotalExam2.Rows.Add();
GrdTotalExam2.Rows[j].Cells["ClmExamID2"].Value = DtStudent.Rows[6 + j]["ExamID"].ToString();
GrdTotalExam2.Rows[j].Cells["ClmDateExam2"].Value = DtStudent.Rows[6 + j]["DateExam"].ToString();
}
}
خطای رخ داده ( به حلقه for اول و به خط GrdTotalExam1.Rows.Add(); گیر میده) :

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

Arash_janusV3
شنبه 25 شهریور 1391, 22:30 عصر
GrdTotalExam2.Rows.Clear();

به این لازم نیست

Mahmoud.Afrad
شنبه 25 شهریور 1391, 22:42 عصر
قبل از خط GrdTotalExam1.Rows.Clear(); دیتاسورس گریدویو را null قرار بدید چون ممکنه قبلا دیتاسورس را ست کرده باشید. ممکن هم هست ست نشده باشه پس خط GrdTotalExam1.Rows.Clear(); لازمه.

veniz2008
شنبه 25 شهریور 1391, 23:08 عصر
GrdTotalExam2.Rows.Clear();

به این لازم نیست
این جواب نداد. یعنی همون خطای قبلی رخ داد.


قبل از خط GrdTotalExam1.Rows.Clear(); دیتاسورس گریدویو را null قرار بدید چون ممکنه قبلا دیتاسورس را ست کرده باشید. ممکن هم هست ست نشده باشه پس خط GrdTotalExam1.Rows.Clear(); لازمه.
دیتاسورس گرید رو null کردم. الان خطای زیر رو میده :

Column named ClmExamID cannot be found.
Parameter name: columnName

Mahmoud.Afrad
یک شنبه 26 شهریور 1391, 12:54 عصر
وقتی دستی و بدون دیتاسورس میخواهید با حلقه مقادیر را در گریدویو درج کنید باید قبلش ستونها رو ایجاد کنید.


اینطوری هم میشه:
int countrecorddt = DtStudent.Rows.Count;
if (countrecorddt <= 6)
{
GrdTotalExam1.DataSource = DtStudent;
GrdTotalExam2.Rows.Clear();
}
else if (countrecorddt > 6 && countrecorddt <= 12)
{
dt1.Clear();
dt2.Clear();
for (int i = 0; i < 6; i++)
{
dt1.ImportRow(DtStudent.Rows[i]);
}
for (int j = 0; j < countrecorddt - 6; j++)
{
dt2.ImportRow(DtStudent.Rows[j + 6]);
}

GrdTotalExam1.DataSource = dt1;
GrdTotalExam2.DataSource = dt2;
}