خطا در زمان ریختن دیتاتیبل درون گریدویو
سلام. من میخوام که درون هر گریدویو حدااکثر 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
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
درود بر شما
در کد متوجه اشکال خواهید شد
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();
}
}
طراحی شما دارای اشکال هستش
اگر تمایل به تغییر دارید اعلام کنید تا کمکتون کنم
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
حتما. خوشحال میشم ایراد کارم رو بفهمم.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
چرا شما باید دو گرید داشته باشید
فقط برای نمایش اطلاعات کاربرد داره؟
اگر 6رکورد اول اطلاعات مهم محسوب می شوند
می توانید آنها را در یک گرید بگذارید و 6رکورد اول را با رنگ خاکستری مشخص کنید
این شیوه شما در بلند مدت مشکلاتی به همراه داره
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
من حداکثر 24 تا رکورد دارم که اولویت همشون یکسانه. درون فرمم اطلاعات دیگه ای هم دارم که امکان نمایش همه رکوردها درون یک گرید وجود نداره( میشه نمایش داد ولی زیبایی نداره). من در واقع 4 تا گرید دارم که هر گرید حداکثر میخوام 6 تا رکورد رو نمایش بده( این 4 گرید سایزشون کوچیک هست که در کنار همدیگه قرار دارند و فضای کمی رو اشغال میکنند).
1 ضمیمه
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
اینم یه عکس از گریدهام تا منظورم رو بهتر متوجه بشید ( منظور از ش ،شماره آزمون هست. فیلد وضعیت یک چک باکس هست که به گرید اضافه کردم و وضعیت انتخاب شدن یا نشدن رکورد(آزمون) رو مشخص میکنه.)
ضمیمه 92872
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
شما می توانید از TreeView هم استفاده کنید
همه را در یک جا بگذارید فقط باید روش کار کنید
اما هم زیبا تر می شه و یا اینکه اینها رو در یک گرید نمایش بدید ولی به سبک زیر شاخه ای
یعنی کاربر با زدن یک علامت + در گرید می تواند جزئیات بیشتری را ببیند
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
نقل قول:
نوشته شده توسط
Arash_janusV3
شما می توانید از TreeView هم استفاده کنید
همه را در یک جا بگذارید فقط باید روش کار کنید
اما هم زیبا تر می شه و یا اینکه اینها رو در یک گرید نمایش بدید ولی به سبک زیر شاخه ای
یعنی کاربر با زدن یک علامت + در گرید می تواند جزئیات بیشتری را ببیند
این اون چیزی نیست که من میخوام. اگر امکان داره با همین روشی که خودم انتخاب کردم توضیح بدید. یعنی من اگر 8 تا رکورد داشته باشم چطوری میتونم 6 تای اول رو داخل گرید1 و 2 تای آخر رو درون گرید2 نمایش بدم؟.تشکر.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
کدی رو که گذاشته بودید تست کردم. اما یه مشکل دیگه پیش میاد.من 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();
}
}
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
نقل قول:
نوشته شده توسط
mafaman2003
دقیقا خطا در کدوم حلقه و به چه خطی گرفته میشه؟
به خط نهم یعنی GrdTotalExam1.Rows.Clear();
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
نقل قول:
به خط نهم یعنی GrdTotalExam1.Rows.Clear();
برای چی پاک می کنید؟
اینطوری اگه 8 رکورد داشتع باشید ، که فقط در گریددوم ، 2 رکورد نمایش داده می شه!
اگه دوازده ستون درست کنید (در یک گرید) چی؟
هر نام در سه ستون تکراربشه!
اینطوری بهتر نمی شه؟!
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
نقل قول:
نوشته شده توسط
ehsan7007
برای چی پاک می کنید؟
اینطوری اگه 8 رکورد داشتع باشید ، که فقط در گریددوم ، 2 رکورد نمایش داده می شه!
اگه دوازده ستون درست کنید (در یک گرید) چی؟
هر نام در سه ستون تکراربشه!
اینطوری بهتر نمی شه؟!
فرض کنید با توجه به مقادیر کمبوها، 8 رکورد داشته باشم (در لحظه لود شدن 8 رکورد دارم که 6 رکورد درون گرید1 و 2 رکورد هم درون گرید2). حالا کاربر مقدار کمبو رو طوری تغییر میده که خروجی میشه 2 رکورد. خوب بایستی اول سطرها رو پاک کنم بعدش بیام از نو سطر اضافه کنم. در مورد 12 ستون در گرید کار نکردم ولی اگه حتی قابل پیاده سازی باشه بازم ظاهر زیبایی نداره.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
برای حذف اطلاعات گرید از این روش می توانید استفاده کنید
GrdTotalExam1.DataSource = new DataTable();
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
فکر می کنم اینطوری بهتر باشه چون من که می خوتستم گریدم رو پاک کنم ، با
GrdTotalExam1.Rows.Clear();
دقیقا همون خطایی رو که برای محمد جان می داد ، می گرفت.
با روش دیگه برای حذف row ها ، صددرصد مشکل ارورتون حل می شه.
موفق باشید.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
متاسفانه حتی همون بار اول هم لود نمیشه و خطای زیر رو میده :
کدها :
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.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
GrdTotalExam2.Rows.Clear();
به این لازم نیست
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
قبل از خط GrdTotalExam1.Rows.Clear(); دیتاسورس گریدویو را null قرار بدید چون ممکنه قبلا دیتاسورس را ست کرده باشید. ممکن هم هست ست نشده باشه پس خط GrdTotalExam1.Rows.Clear(); لازمه.
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
نقل قول:
نوشته شده توسط
Arash_janusV3
GrdTotalExam2.Rows.Clear();
به این لازم نیست
این جواب نداد. یعنی همون خطای قبلی رخ داد.
نقل قول:
نوشته شده توسط
mafaman2003
قبل از خط GrdTotalExam1.Rows.Clear(); دیتاسورس گریدویو را null قرار بدید چون ممکنه قبلا دیتاسورس را ست کرده باشید. ممکن هم هست ست نشده باشه پس خط GrdTotalExam1.Rows.Clear(); لازمه.
دیتاسورس گرید رو null کردم. الان خطای زیر رو میده :
Column named ClmExamID cannot be found.
Parameter name: columnName
نقل قول: خطا در زمان ریختن دیتاتیبل درون گریدویو
وقتی دستی و بدون دیتاسورس میخواهید با حلقه مقادیر را در گریدویو درج کنید باید قبلش ستونها رو ایجاد کنید.
اینطوری هم میشه:
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;
}