PDA

View Full Version : خطا در انتقال GridControl Devexpress در انتقال داده گربد به DataTable



ebrahim.rayatparvar
سه شنبه 05 خرداد 1394, 11:14 صبح
سلام و درود به دوستان خوبم.

من میخوام مقدار سطرهای گرید خودمو که با کامپوننت Devexpress طراحی کردم بریزم به داخل DataTable.
چند نکته وجود داره که باید بگم :

1- گرید من 5 ستون داره
2- ستون اول که برای ذخیره کد جدولی هست Visible=false
3- برای اولین بار میخوام ذخیره کنم مقدار string.Empty برای ستون کد میفرستم و داخل SQL Serever بهش مقدار داده میشه.
4- مشکل بزرگ که پیغام خطا معروف Object reference not set to an instance of an object میاد که همه میدونن برای چیه ولی همین منو گیج کرده.
5- من تو تریس که میزارم مثلا اگه 4 سطر به گرید اضافه کنم حلقه for من تا 3 مرحله اول درست کار می کنه ولی تو مرحله آخر رو خط اول انتقال داده پیغام خطا بالا رو میده.
6- من تو MessageBox تعداد سطر رو نشون دادم میزنه 4 بعد مرحله 4 پیغام خطا میده.
7- حلقه خودم رو منهای 1 کردم اون 3سطر به درستی ذخیره میشه.
فعلا همین نکات که به ذهنم رسیده

کد هم به شرح زیره :



blCls._Kind = 3;
for (int i = 0; i < gridViewCarName.RowCount ; i++)
{
if (gridViewCarName.RowCount > 0)
{
dt3.Rows.Add();
dt3.Rows[i]["CodeCarList"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CodeCarList"]);
dt3.Rows[i]["CarName"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarName"]);
string strCarType = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarType"]).ToString();
if (strCarType == "سبک")
dt3.Rows[i]["CarType"] = 1;
else if (strCarType == "سنگین")
dt3.Rows[i]["CarType"] = 2;
else if (strCarType == "ساختمانی")
dt3.Rows[i]["CarType"] = 3;
dt3.Rows[i]["CarGroup"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarGroup"]);
dt3.Rows[i]["Manufacturer"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["Manufacturer"]);
}
}
blCls._CarList = dt3;
str = blCls.dalAddList();

ebrahim.rayatparvar
سه شنبه 05 خرداد 1394, 12:59 عصر
سلام دوستان
کسی اگه نظری به ما هم بکنید من ممنون میشم.

ali_md110
سه شنبه 05 خرداد 1394, 19:15 عصر
DataTable tbl = new DataTable();
DataRow Drow;
for (int i = 0; i < gridViewCarName.RowCount; i++)
{
Drow = tbl.NewRow();
Drow["CarName"] = ((DataRowView)gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarName"]).ToString();

tbl.Rows.Add(Drow);

}

ebrahim.rayatparvar
سه شنبه 05 خرداد 1394, 19:40 عصر
سلام داداش علی.
این کد هم جای گذاری کردم دقیقا همون مشکل قبل رو داره دقیقا حلقه برای بار آخر که وارد میشه به اولین خط انتقال


Drow["CarName"] = ((DataRowView)gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarName"]).ToString();

که میرسه دوباره پیغام خطا Object reference not set to an instance of an object رو میده نمیدونم چرا برای مراحل اول نمیده در صورتی که همه اینها 0 هستند.

ali_md110
سه شنبه 05 خرداد 1394, 21:09 عصر
با کنترل Grid شرکت DevExpress کار نکردم ولی گویا مشکل وهله سازی هست ممکنه دسترسی به ردیفهای گراید با GetRowCellValue اشتباه باشه
روش ارسال اطلاعات از دیتاگراید به دیتاتیبل با حلقه بدین روش صحیح هست و مشکلی نداره میتونید با یک دیتاگراید استاندارد ویندوز امتحان کنید

aslan
سه شنبه 05 خرداد 1394, 21:17 عصر
سلام
فکر کنم باید به شکل زیر بنویسید :


for (int i = 0; i < gridViewCarName.RowCount-1 ; i++)

ebrahim.rayatparvar
چهارشنبه 06 خرداد 1394, 10:18 صبح
سلام
فکر کنم باید به شکل زیر بنویسید :


for (int i = 0; i < gridViewCarName.RowCount-1 ; i++)


سلام مهندس جان
من بالا هم گفتم منهای 1 می کنم درست کار می کنه فقط مشکلی که داره اون وقت سطر آخر گرید رو تو Datatable نمیریزه.

aslan
چهارشنبه 06 خرداد 1394, 12:09 عصر
سلام و درود به دوستان خوبم.

من میخوام مقدار سطرهای گرید خودمو که با کامپوننت Devexpress طراحی کردم بریزم به داخل DataTable.
چند نکته وجود داره که باید بگم :

1- گرید من 5 ستون داره
2- ستون اول که برای ذخیره کد جدولی هست Visible=false
3- برای اولین بار میخوام ذخیره کنم مقدار string.Empty برای ستون کد میفرستم و داخل SQL Serever بهش مقدار داده میشه.
4- مشکل بزرگ که پیغام خطا معروف Object reference not set to an instance of an object میاد که همه میدونن برای چیه ولی همین منو گیج کرده.
5- من تو تریس که میزارم مثلا اگه 4 سطر به گرید اضافه کنم حلقه for من تا 3 مرحله اول درست کار می کنه ولی تو مرحله آخر رو خط اول انتقال داده پیغام خطا بالا رو میده.
6- من تو MessageBox تعداد سطر رو نشون دادم میزنه 4 بعد مرحله 4 پیغام خطا میده.
7- حلقه خودم رو منهای 1 کردم اون 3سطر به درستی ذخیره میشه.
فعلا همین نکات که به ذهنم رسیده

کد هم به شرح زیره :



blCls._Kind = 3;
for (int i = 0; i < gridViewCarName.RowCount ; i++)
{
if (gridViewCarName.RowCount > 0)
{
dt3.Rows.Add();
dt3.Rows[i]["CodeCarList"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CodeCarList"]);
dt3.Rows[i]["CarName"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarName"]);
string strCarType = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarType"]).ToString();
if (strCarType == "سبک")
dt3.Rows[i]["CarType"] = 1;
else if (strCarType == "سنگین")
dt3.Rows[i]["CarType"] = 2;
else if (strCarType == "ساختمانی")
dt3.Rows[i]["CarType"] = 3;
dt3.Rows[i]["CarGroup"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["CarGroup"]);
dt3.Rows[i]["Manufacturer"] = gridViewCarName.GetRowCellValue(i, gridViewCarName.Columns["Manufacturer"]);
}
}
blCls._CarList = dt3;
str = blCls.dalAddList();


سلام
در کد بالا کد if داخل حلقه for بی معنی است ..
روش کار به این شکل باید باشد :
در داخل حلقه ابتدا باید یک datarow ایجاد کنید


DataRow dr = dt3.NewRow();

سپس ستونهای مورد نظر در گرید را خوانده و در DataRow ایجاد شده قرار میدین
در انتها DataRow ایجاد شده را به دیتاتیبل اضافه میکنید ....
شکل کلی دستورات شبیه کدهای زیر میتونه باشه :


foreach (GridViewRow row in gridViewCarName.Rows)
{
DataRow dr = dt3.NewRow();
dr["CodeCarList"] = row.Cells[1].Text; // شماره ستون مربوطه در گرید بجای 1 جایگزین شود
dr["CarName"] = row.Cells[2].Text; // ...
//...........
dt3.Rows.Add(dr);
}

موفق باشید

ebrahim.rayatparvar
چهارشنبه 06 خرداد 1394, 12:17 عصر
سلام مهندس جان
من این کد رو هم زدم همون مشکل رو داشت برای رفع این مشکل از Bindingource استفاده کردم کارم درست شد نیاز به این همه کد هم نیست.