View Full Version : ویرایش ی datagrid و ذخیره ی آن در database
sepideh06
سه شنبه 14 آبان 1387, 19:54 عصر
سلام دوستان.من قبل از پرسیدن سوالمdatagrid رو search کردم و تمام سوال جواب ها رو خوندم و علی رغم تکراری بودن اکثر سوال ها و جواب ها, جوابمو نگرفتم.
من می خوام وقتی محتویات یه table در datagrid نمایش داده می شه , همون جا تو datagrid تغیییرات رو در فیلدها اعمال کنم و با زدن یک دکمه ی ذخیره این تغییرات در جدولم در database , ذخیره بشه.و برام مهمه که این تغییرات در خود datagrid صورت بگیره و نه از طریق چند تا textbox .ممنون می شم راهنماییم کنید.با کد البته.
متشکرم.
SMRAH1
سه شنبه 14 آبان 1387, 21:28 عصر
اگر datagrid به dataset متصل یا bind شده باشه به محض تغییر در datagrid در dataset اعمال میشه.توجه کن که برای ثبت این تغییرات در پایگاه داده باید ،اون را توسط dataset بروز کنی.
موفق باشی
Sal_64
جمعه 24 آبان 1387, 11:57 صبح
سلام
با انجام تغییرات در دیتاگرید و بعد از اون توسط دیتاست و ثبت در پایگاه داده
سوال به وجود می آد
با توجه به کد زیر(لز نمونه برنامه های موجود در بخش)
SqlDataAdapter dt;
DataSet ds;
dt.Update(ds, "table1");یک سوال
مثلا فرض کنید داخل دیتا ست 500 رکورد هست بعد ریخته شده داخل دیتاگرید
و تنها در یک رکورد تغییری ایجاد شود
آیا تنها همین تغییر اعمال می شود (یعنی برنامه خودش متوجه میشه کدوم رکورد رو باید تغییر بده)
و یا تمام رکوردها UPDATE میشوند
منظور مقدار زمان و حافظه مصرفی برابر با تمام رکوردهاست و یا تنها همون رکورد تغییر یافته
امیدوارم سوال مبهم نباشه
با تشکر
Sal_64
شنبه 25 آبان 1387, 21:27 عصر
سلام
شاید سوال مبهم شده
جور دیگه مطرح می کنم
فرض کنید یه دیتاست داریم با 500 رکورد و یه دیتاست دیگه با 5 تا رکورد حال داخل هر دو اینها یک رکورد رو تغییر داده
و سپس اون دیتا ست رو آپدیت می کنیم(با دستور فوق)
آیا از لحاظ استفاده از منابع حافظه و زمان با توجه با اینکه دیتابیس هم، روی سرور قرار داره تفاوتی وجود داره؟؟؟
با تشکر
Sal_64
جمعه 15 آذر 1387, 16:28 عصر
سلام
برای انجام تغییرات در دیتاگرید و ثبت اونا در بانک داده به وسیله دیتاست
کدی نوشتم که خطا میده
البته به این نکته توجه کنید من دیتاست رو از کلاسی می گیرم
و تنها ماده اولیه من هم یک دیتاست تنهاست
یک دیتاست تعریف کرده و دیتاست دریافتی از کلاس رو به اون نسبت دادم
void delete(int row)
{
DataSet dataSet = new DataSet();
dataSet = get_dataset;
SqlDataAdapter da = new SqlDataAdapter();
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataTable dt = dataSet.Tables[0];
DataRow currentrow = dt.Rows[row];
currentrow.Delete();
da.Fill(dataSet);
if (objdataset_delete.HasChanges() == true)
dt = dt.GetChanges();
da.Update(dt);
}خطا
The SelectCommand property has not been initialized before calling 'Fill'.چه باید کرد؟
البته برای سوال پست قبل مطلبی رو در بخش پیدا کردم که یکی از دوستان بر طبق بررسی شخصی متوجه شده بود که تنها
زمان و منابع صرف تعداد رکوردهای تغییر یافته می شود ، و تمام رکوردها به روز رسانی نمی شوند
آیا مطلبی علمی در این مورد وجود دارد ؟
با تشکر
PERFORIN
جمعه 15 آذر 1387, 18:25 عصر
سلام
من یک پیشنهاد دیگه براتون دارم
datagrid گزینه ی خوبی برای کاری که شما می خواین انجام بدین نیست
من ms flex grid را پیشنهاد می کنم البته این ابزار جزو کنترل های اصلی نیست و باید خودتون اونا اضافه کنید این کنترل این قابلیت را داره که هر کدوم از سلول هاش به عنوان یک textbox عمل کنه در حالی که شکلش مثل datagrid هست
Sal_64
شنبه 16 آذر 1387, 10:29 صبح
سلام
تشکر
دوستان کسی میدونه ایراد اون کد از چیه
و چه باید کرد؟؟
با تشکر
sara_B
شنبه 16 آذر 1387, 16:39 عصر
سلام دوستان.من قبل از پرسیدن سوالمdatagrid رو search کردم و تمام سوال جواب ها رو خوندم و علی رغم تکراری بودن اکثر سوال ها و جواب ها, جوابمو نگرفتم.
من می خوام وقتی محتویات یه table در datagrid نمایش داده می شه , همون جا تو datagrid تغیییرات رو در فیلدها اعمال کنم و با زدن یک دکمه ی ذخیره این تغییرات در جدولم در database , ذخیره بشه.و برام مهمه که این تغییرات در خود datagrid صورت بگیره و نه از طریق چند تا textbox .ممنون می شم راهنماییم کنید.با کد البته.
متشکرم.
با سلام
واسه حل مشكلتون با من همراه بشيد (مراحل رو به ساده ترين شكل ممكن توضيح دادم)
اول واسه راحتي كارتون يه پروژه ي آماده(پروژه كه نه ، يه مثال كوچولو:چشمک:) گذاشتم كه مي تونيد دانلود كنيد:(اين مثال web app هستش )
چيزايي كه واسه فهميدن پروژه بهتره بدونيد:
1- نام connection string من conn است .(البته نيازي به attach كردن نيست ، كافيه پروژه را درويژوال استوديو( VS2005 ، يا VS2008 ) باز كنيد.
2- نام ديتا بيس: Ecommerce ، كه داراي يك جدول به نام Employee (كارمندان) است.
3-اين جدول داراي سه فيلد :
1- ID
2-name
3- family
مي باشد.
در اين پروژه عمليات زير قابل اجرا است :
1-انتخاب يك ستون از گريد ويو -----(Select)
2-حذف يك ركورد از گريد ويو و بلافاصله حذف از ديتا بيس-----(Delete)
3-ويرايش تمام ستون ها در گريد ويو و اِعمال آن در جدول ديتا بيس ( امكان به روز رساني يا انصراف از حالت ويرايش)----- (Edit)
4-افزودن يك ركورد جديد به گريد ويو و ديتا بيس-----(Insert)
كارايي كه توي اين مثال انجاميدم ، اينجا واستون شرح مي دم .
(البته 2 روش وجود داره كه يكي راحت تره ، و اون يكي كامل تره ، كه من دومي رو مي گم)
توضيح چهار قابليت بالا :
براي شروع مثلث كوچك كنار گريد ويو را كليك كنيد و گزينه ي Edit Columns را انتخاب نماييد:
مورد اول و دوم :
انتخاب يك ستون از گريد ويو -----(Select) و حذف يك ركورد از گريد ويو و بلافاصله حذف از ديتا بيس-----(Delete) :
يك Button Field از ليست Add كنيد.
خصوصيت Text را برابر با "انتخاب" قرار دهيد.
خصوصيت CommandName را برابر با btnselect و يا نام دلخواه ديگري بگذاريد(از اين نام براي اجراي دستورات دلخواهي كه قرار است با كليك بر روي اين دكمه اجرا شوند ، در كد نويسي استفاده مي شود.)
اكنون به پنل properties ِ مربوط به گريد ويو رفته و دكمه ي Events را انتخاب كنيد ، تا event هاي موجود كه براي گريد ويو در نظر گرفته شده ، نمايش داده شود .
مقابل كلمه ي RowCommand دبل كليك كنيد تا وارد صفحه ي كد شود ، اكنون كد زير را وارد نماييد:
int idx;
if (e.CommandName == "btnselect")
{
idx = Convert.ToInt32(e.CommandArgument);
GridView1.Rows[idx].BackColor = System.Drawing.Color.LightGreen;
}
else if (e.CommandName == "btndelete")
{
idx = Convert.ToInt32(e.CommandArgument);
int ID = (int)GridView1.DataKeys[idx].Value;
delete_employee(ID);
refresh_grvEmployee();
}
مجددا به Edit Columns باز گشته و يك دكمه ي ديگر مانند دكمه ي "انتخاب" ، Add كنيد.
با اين تفاوت كه :
خصوصيت Text را برابر با "حذف كارمند" قرار دهيد.
خصوصيت CommandName را برابر با btndelete و يا نام دلخواه ديگري بگذاريد.
نكته :با انتخاب هر ركورد در اين پروژه ، رنگ ركورد به رنگ سبز روشن در مي آيد ، جهت تغيير رنگ در كد زير ، به جاي LightGreenرنگ دلخواه خود را قرار دهيد:
GridView1.Rows[idx].BackColor = System.Drawing.Color.نام رنگ دلخواه شما;
مورد سوم :
ويرايش يا انصراف از حالت ويرايش----- (Edit)
گريد ويو داراي يك دكمه ي سه وضعيتي به نام edit,update,cancle مي باشد، كه هنگام كار با گريد ويو در پنجره ي Edit Columns و در ليست سمت چپ (available list ) مشاهده مي نماييد.
اين دكمه را Add كنيد و در بخش خصوصيات آن (كه در ليست سمت راست مشاهده مي كنيد) تغييرات دلخواه خود (تغيير نام دكمه ها به فارسي ) را انجام دهيد.
به پنل properties ِ مربوط به گريد ويو رفته و دكمه ي Events را انتخاب كنيد ، تا event هاي موجود كه براي گريد ويو در نظر گرفته شده ، نمايش داده شود .
مقابل كلمات RowCancelingEdit، RowEditing و RowUpdating دبل كليك كنيد تا evente مربوط به آنها در قسمت كد قرار گيرد .
اكنون طبق مثال من در پروژه كدها را به ترتيب وارد نماييد، اكنون پروژه ي شما آماده ي اجراست...:لبخندساده:
(جهت درج اطلاعات (Insert) نيز ابتدا بر روي فرم خود ، كنترل اي لازم را قرار دهيد ،دكمه ي "ذخيره ي اطلاعات" را در فرم قرار داده ، رويداد onclick دكمه را در قسمت كد فعال كنيد ،و كدهايي كه من در تابع رويداد onclick دكمه ي btnSave نوشتم را ضافه كنيد.)
موفق باشيد.
Sal_64
شنبه 16 آذر 1387, 18:58 عصر
سلام دوست عزیز sara_b
نمونه کد شما رو دیدم
لطف شما قابل تقدیره
امیدوارم برای دوستان مفید واقع بشه
اما سوال پست 5 من هنوز بدون جواب مونده :ناراحت:
دوستان کسی می تونه راهنمایی کنه؟؟
با تشکر
rostamkhani
یک شنبه 17 آذر 1387, 19:47 عصر
سلام
دو دستور زیر رو تست کنین ببینید جواب میده .
قبل از da.update
this.BindingContext[dt].EndCurrentEdit();
یا
da.update(ds1,"table1");
Sal_64
یک شنبه 17 آذر 1387, 20:37 عصر
سلام جناب rostamkhani
تشکر
کد اول رو قرار دادم و ایرروری نداد
اما برای کد زیر احتیاج به یک استرینگ داره
da.Update(dataset, " ");چی باید بنویسم ؟
و ایررور fill هم همچنان باقی است
اگر اون رو ببندم
روی
da.Update(dt);ایررور
The DataAdapter.SelectCommand property needs to be initialized.رو میده
چه باید کرد ؟؟
با تشکر:قلب:
xxxxxxxxxx
یک شنبه 17 آذر 1387, 22:55 عصر
سلام فکر کنم مشکل از نداشتن new command درون dataAdapter باشد
این خط اینگونه تغییر بده
SqlDataAdapter da = new SqlDataAdapter(new sqlcommand("select * from table"))
لازم بذکر است که دستوراتی که SqlCommandBuilder برای insert ,updateیاdeleteمیسازد براساس دستور selectداخل دیتا آداپتور می باشد.لذا دستور select تان را درون تعریف command یا دیتا آداپتور بیاورید.امیدوارم مفید باشد.
Sal_64
دوشنبه 18 آذر 1387, 12:48 عصر
سلام
تشکر
همونطور که قبلا گفته شد تنها ماده اولیه یک دیتاست که از کلاسی گرفته می شود
و در ضمن تمام ارتباط ها با بانک داده از طریق sp هست
باز هم از لطفتون ممنونم :لبخندساده:
دوستان چه باید کرد؟ :افسرده:
با تشکر
xxxxxxxxxx
سه شنبه 19 آذر 1387, 06:49 صبح
سلام ببینید این
The SelectCommand property has not been initialized before calling 'Fill'. پیغام یعنی SelectCommand شیئ DataAdapter تون درست property هاش تنظیم نشده.
از کدی که گذاشتید نمی توان به برنامه فهماند که با sp کارکردی مثلا درتعریف SqlDataAdapter باید درون یک استرینگ نام sp خود را می نوشتی و خاصیتی فکر کنم بنام commandType آنرا مساوی spمیکردی.بعدش هم پرامترهای دیتا آداپتورتون رو که اینجا میتونه idرکورد حذفی باشه را به آن می دادید.
خلاصه برنامه باید یه جوری بفهمه که با چه بانکی ارتباط برقرار کنه(conection string)وبا اطلاعات چه برخوردی کنه(select command یا sp).
درضمن زمان استفاده ازدرستور
da.Fill(dataSet);موقعیست که کار حذف تمام شودوحالابخواهی حاصل کارراازبانک بخوانی یا قبل از استفاده از دستور delete چراکه با پرکردن دیتا ست دیگررکوردحذف شده ات بدون حالت حذف می شودواثرش ازبین میرود.
Sal_64
سه شنبه 19 آذر 1387, 14:05 عصر
سلام
xx... جان تشکر
توضیحات کامل بود
ولی اینطوری توی فرمم باید برای ارتباط با پایگاه دوباره کلی کد بنویسم(کد داخل کلاس ها رو کپی پیست کنم)
و جای دردناکش اینجاست که 12-13 تا تیبل وجود داره :ناراحت:
میشه توضیحات زیباتون رو به قطعه کی جم و جور مزین کنید :خجالت:
با تشکر
saadi2
یک شنبه 29 آذر 1388, 22:18 عصر
وقتی شما از دستور fill استفاده میکنید باید مشخص کنید که اطلاعات کدام جدول دیتاست update شود مثال:
da.fill(DS,"table1")
da.fill(ds, "table2"
,وبعد از تغییر جدول با دستور زیر update نمایید:
da.update(DS, "table1")
da.update(ds,"table2")
programteach
چهارشنبه 09 دی 1388, 06:38 صبح
ا سلام
من به یک مشکل ناجور و سختی برخورد کرده ام . واعصابم بهم ریخته است.
می رکورد هایی به DADAGRID اضافه می کنم اما وقتی که از برنامه در حال اجرا خارج می شوم و دوباره وارد می شوم این رکورد ها در پایگاه داده ذخیره نشده است از روشهای مختلفی هم برای درج رکورد و آپدیت DATASET استفاده کردهام ولی جواب نداده اند.
تورو به خاطر خدا یه نفر به من کمک کند.
سلام
من به یک مشکل ناجور و سختی برخورد کرده ام . واعصابم بهم ریخته است.
می رکورد هایی به DADAGRID اضافه می کنم اما وقتی که از برنامه در حال اجرا خارج می شوم و دوباره وارد می شوم این رکورد ها در پایگاه داده ذخیره نشده:عصبانی++: است از روشهای مختلفی هم برای درج رکورد و آپدیت DATASET استفاده کرده ام ولی جواب نداده اند.
تورو به خاطر خدا یه نفر به من کمک کند. :افسرده::افسرده:
به مشکل سختی برخورد کرده ام .
رکورد هایی به dataset , datagrid اضافه می کنم اما به پایگاه داده اضافه نمی شود.
وقتی که از حالت اجرا خارج می شوم ودوباره برنامه را اجرا می کنم رکورد های جدید در datagrid نمایش داده نمی شوند علت چیست ؟
mostafa_shaeri_tj
دوشنبه 23 فروردین 1389, 01:18 صبح
سلام.
اگر ممکنه امکان ویرایش یک رکورد در گرید ویو را در windows application هم لطف کنید و توضیح مختصری بدید. چون شما فقط این کار رو در web app گفتید من نتونستم تو پروژم به کار بگیرم.
manij_mhm
شنبه 13 شهریور 1389, 17:15 عصر
سلام.
چطوری میشه تغییران موجود در دیتاگرید ویو رو در دیتابیس ثبت کرد. مشکل اینجاست که از چند جدول برای نمایش اطلاعات موجود در گریدویو استفاده شده.
ممنون.
ostovarit
شنبه 13 شهریور 1389, 17:17 عصر
سلام.
چطوری میشه تغییران موجود در دیتاگرید ویو رو در دیتابیس ثبت کرد. مشکل اینجاست که از چند جدول برای نمایش اطلاعات موجود در گریدویو استفاده شده.
ممنون.
از ds.update نمیتونید استفاده کنید ...
من در این حالت برای ذخیره داده ها تعداد ردیف ها رو بدست میارم و در یک حلقه for میزاریم و اطلاعات رو با توجه به pk به روز میکنم ...
manij_mhm
شنبه 13 شهریور 1389, 17:53 عصر
از ds.update نمیتونید استفاده کنید ...
من در این حالت برای ذخیره داده ها تعداد ردیف ها رو بدست میارم و در یک حلقه for میزاریم و اطلاعات رو با توجه به pk به روز میکنم ...
ممنون.
بله دقیقا مشکل همینجاست که نمی شه از ds.update استفاده کرد.
یعنی شما کل داده ها رو بازنویسی می کنید؟
حجم داده ها زیاده اگه بخوام کلشون رو بازنویسی کنم خیلی بهینه نمیشه.
راهی نیست که به سطر هایی دسترسی داشت که تغییر کردند.
manij_mhm
سه شنبه 16 شهریور 1389, 12:57 عصر
کسی نمی تونه کمک کنه؟
melikarezaei
دوشنبه 24 تیر 1398, 18:19 عصر
سلام خسته نباشین
من سر پروژم لطفا پروژه اماده ای از متدهای دیلیت و ویرایش و ایجاد بانک اطلاعاتی دارین تا کمکم کنه ؟
melikarezaei
دوشنبه 24 تیر 1398, 18:19 عصر
خیلی خیلی عجله دارم ممنون میشم اگه کمکم کنین
melikarezaei
دوشنبه 24 تیر 1398, 19:08 عصر
:گریه::گریه::گریه::گریه::گریه: :گریه:
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.