# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  ویرایش ی datagrid و ذخیره ی آن در database

## sepideh06

سلام دوستان.من قبل از پرسیدن سوالمdatagrid رو search کردم و تمام سوال جواب ها رو خوندم و علی رغم تکراری بودن اکثر سوال ها و جواب ها, جوابمو نگرفتم.
من می خوام وقتی محتویات یه table در datagrid نمایش داده می شه , همون جا تو datagrid تغیییرات رو در فیلدها اعمال کنم و با زدن یک دکمه ی ذخیره  این تغییرات در جدولم در database ,  ذخیره بشه.و برام مهمه که این تغییرات در خود datagrid صورت بگیره و نه از طریق چند تا textbox .ممنون می شم راهنماییم کنید.با کد البته.
متشکرم.

----------


## SMRAH1

اگر datagrid به dataset متصل یا bind شده باشه به محض تغییر در datagrid در dataset اعمال میشه.توجه کن که برای ثبت این تغییرات در پایگاه داده باید ،اون را توسط dataset بروز کنی.

موفق باشی

----------


## Sal_64

سلام

با انجام تغییرات در دیتاگرید و بعد از اون توسط دیتاست و ثبت در پایگاه داده
سوال به وجود می آد
با توجه به کد زیر(لز نمونه برنامه های موجود در بخش)
    SqlDataAdapter dt;
            DataSet ds;
            dt.Update(ds, "table1");یک سوال 
مثلا فرض کنید داخل دیتا ست 500 رکورد هست بعد ریخته شده داخل دیتاگرید
و تنها در یک رکورد تغییری ایجاد شود
آیا تنها همین تغییر اعمال می شود (یعنی برنامه خودش متوجه میشه کدوم رکورد رو باید تغییر بده)
و یا تمام رکوردها UPDATE میشوند 

منظور مقدار زمان و حافظه مصرفی برابر با تمام رکوردهاست و یا تنها همون رکورد تغییر یافته

امیدوارم سوال مبهم نباشه


با تشکر

----------


## Sal_64

سلام

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

فرض کنید یه دیتاست داریم با 500 رکورد و یه دیتاست دیگه با 5 تا رکورد حال داخل هر دو اینها یک رکورد رو تغییر داده 
و سپس اون دیتا ست رو آپدیت می کنیم(با دستور فوق)

آیا از لحاظ استفاده از منابع حافظه و زمان با توجه با اینکه دیتابیس هم، روی سرور قرار داره تفاوتی وجود داره؟؟؟


با تشکر

----------


## Sal_64

سلام

برای انجام تغییرات در دیتاگرید  و ثبت اونا در بانک داده به وسیله دیتاست

کدی نوشتم که خطا میده
البته به این نکته توجه کنید من دیتاست رو از کلاسی می گیرم
و تنها ماده اولیه من هم یک دیتاست تنهاست 

یک دیتاست تعریف کرده و دیتاست دریافتی از کلاس رو به اون نسبت دادم
  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

سلام
من یک پیشنهاد دیگه براتون دارم
datagrid گزینه ی خوبی برای کاری که شما می خواین انجام بدین نیست
من ms flex grid را پیشنهاد می کنم البته این ابزار جزو کنترل های اصلی نیست و باید خودتون اونا اضافه کنید این کنترل این قابلیت را داره که هر کدوم از سلول هاش به عنوان یک textbox عمل کنه در حالی که شکلش مثل datagrid هست

----------


## Sal_64

سلام
تشکر

دوستان کسی میدونه ایراد اون کد از چیه
و چه باید کرد؟؟

با تشکر

----------


## sara_B

*



			
				سلام دوستان.من قبل از پرسیدن سوالم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

سلام دوست عزیز  sara_b

نمونه کد شما رو دیدم
لطف شما قابل تقدیره
امیدوارم برای دوستان مفید واقع بشه

اما سوال پست 5 من هنوز بدون جواب مونده  :ناراحت: 
دوستان کسی می تونه راهنمایی کنه؟؟

با تشکر

----------


## rostamkhani

سلام
دو دستور زیر رو تست کنین ببینید جواب میده .

قبل از da.update

this.BindingContext[dt].EndCurrentEdit();


یا

da.update(ds1,"table1");

----------


## Sal_64

سلام جناب rostamkhani
تشکر

کد اول رو قرار دادم و ایرروری نداد
اما برای کد زیر احتیاج به یک استرینگ داره 
  da.Update(dataset, " ");چی باید بنویسم ؟
و ایررور fill هم همچنان باقی است
اگر اون رو ببندم 
روی
 da.Update(dt);ایررور



> The DataAdapter.SelectCommand property needs to be initialized.


رو میده
چه باید  کرد ؟؟

با تشکر :قلب:

----------


## xxxxxxxxxx

سلام فکر کنم مشکل از نداشتن new command درون dataAdapter باشد
این خط اینگونه تغییر بده

 SqlDataAdapter da = new SqlDataAdapter(new sqlcommand("select * from table"))

لازم بذکر است که دستوراتی که SqlCommandBuilder برای insert ,updateیاdeleteمیسازد براساس دستور selectداخل دیتا آداپتور می باشد.لذا دستور select تان را درون تعریف command یا دیتا آداپتور بیاورید.امیدوارم مفید باشد.

----------


## Sal_64

سلام

تشکر
همونطور که قبلا گفته شد تنها ماده اولیه یک دیتاست که از کلاسی گرفته می شود
و در ضمن تمام ارتباط ها با بانک داده از طریق sp هست 

باز هم از لطفتون ممنونم  :لبخند: 


دوستان چه باید کرد؟  :افسرده: 

با تشکر

----------


## xxxxxxxxxx

سلام ببینید این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

سلام
xx...  جان تشکر 
توضیحات کامل بود
ولی اینطوری توی فرمم باید برای ارتباط با پایگاه دوباره کلی کد بنویسم(کد داخل کلاس ها رو کپی پیست کنم)
و جای دردناکش اینجاست که 12-13 تا تیبل وجود داره  :ناراحت: 

میشه توضیحات زیباتون رو به قطعه کی جم و جور مزین کنید  :خجالت: 

با تشکر

----------


## saadi2

وقتی شما از دستور fill استفاده میکنید باید مشخص کنید که اطلاعات کدام جدول دیتاست update شود مثال:

da.fill(DS,"table1") 
da.fill(ds, "table2"

,وبعد از تغییر جدول با دستور زیر update نمایید:

da.update(DS, "table1")
da.update(ds,"table2")

----------


## programteach

ا سلام 
من به یک مشکل ناجور و سختی برخورد کرده ام . واعصابم بهم ریخته است.
می رکورد هایی به  DADAGRID اضافه می کنم اما وقتی که از برنامه در حال اجرا خارج می شوم و دوباره وارد می شوم این رکورد ها در پایگاه داده  ذخیره نشده است از روشهای مختلفی هم برای درج رکورد  و آپدیت  DATASET استفاده کردهام ولی جواب نداده اند.
تورو به خاطر خدا یه نفر به من کمک کند.

سلام 
من به یک مشکل ناجور و سختی برخورد کرده ام . واعصابم بهم ریخته است.
می رکورد هایی به DADAGRID اضافه می کنم اما وقتی که از برنامه در حال اجرا خارج می شوم و دوباره وارد می شوم این رکورد ها در *پایگاه داده ذخیره نشده* است از روشهای مختلفی هم برای درج رکورد و آپدیت DATASET استفاده کرده ام ولی جواب نداده اند.
تورو به خاطر خدا یه نفر به من کمک کند.  :افسرده:  :افسرده: 

به مشکل سختی برخورد کرده ام .
رکورد هایی به  dataset  ,  datagrid   اضافه می کنم  اما به پایگاه داده اضافه نمی شود.
وقتی که از حالت اجرا خارج می شوم ودوباره برنامه را اجرا می کنم رکورد های جدید در  datagrid نمایش داده نمی شوند   علت چیست ؟

----------


## mostafa_shaeri_tj

سلام. 
اگر ممکنه امکان ویرایش یک رکورد در گرید ویو را در windows application هم لطف کنید و توضیح مختصری بدید. چون شما فقط این کار رو در web app گفتید من نتونستم تو پروژم به کار بگیرم.

----------


## manij_mhm

سلام. 
چطوری میشه تغییران موجود در دیتاگرید ویو رو در دیتابیس ثبت کرد. مشکل اینجاست که از چند جدول برای نمایش اطلاعات موجود در گریدویو استفاده شده.

ممنون.

----------


## ostovarit

> سلام. 
> چطوری میشه تغییران موجود در دیتاگرید ویو رو در دیتابیس ثبت کرد. مشکل اینجاست که از چند جدول برای نمایش اطلاعات موجود در گریدویو استفاده شده.
> 
> ممنون.


از ds.update نمیتونید استفاده کنید ...
من در این حالت برای ذخیره داده ها تعداد ردیف ها رو بدست میارم و در یک حلقه for میزاریم و اطلاعات رو با توجه به pk به روز میکنم ...

----------


## manij_mhm

> از ds.update نمیتونید استفاده کنید ...
> من در این حالت برای ذخیره داده ها تعداد ردیف ها رو بدست میارم و در یک حلقه for میزاریم و اطلاعات رو با توجه به pk به روز میکنم ...


ممنون.
بله دقیقا مشکل همینجاست که نمی شه از ds.update استفاده کرد.
یعنی شما کل داده ها رو بازنویسی می کنید؟
حجم داده ها زیاده اگه بخوام کلشون رو بازنویسی کنم خیلی بهینه نمیشه.
راهی نیست که به سطر هایی دسترسی داشت که تغییر کردند.

----------


## manij_mhm

کسی نمی تونه کمک کنه؟

----------


## melikarezaei

سلام خسته نباشین 
من سر پروژم لطفا پروژه اماده ای از متدهای دیلیت و ویرایش و ایجاد بانک اطلاعاتی دارین تا کمکم کنه ؟

----------


## melikarezaei

خیلی خیلی عجله دارم ممنون میشم اگه کمکم کنین

----------


## melikarezaei

:گریه:  :گریه:  :گریه:  :گریه:  :گریه:  :گریه:

----------

