التزام التغييرات بعد تحرير DataGridView باستخدام LINQ2SQL (WinForms)

StackOverflow https://stackoverflow.com/questions/1625659

سؤال

بالنظر إلى DataGridView الذي يحتوي على مجموعة Bindingsource مثل هذا:

على winform ، نضيف كائن Bindingsource باستخدام المصمم ، يسمى MyBindingScource. ثم على النموذج.

myBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram

في وقت لاحق ، في الشكل نفسه نفعل:

myDataView.DataSource = myBindingSource;

ثم لدينا طريقة تملأ الشبكة ...

using ( myDataContext mdc = new MyDataContext() )
{
    myDataView.DataSource = from per in mdc.person
                            select per;
}

كملاحظة جانبا ، قمت بإعداد الأعمدة في وقت التصميم ، وكل شيء يظهر على ما يرام. نظرًا لأن LINQ 2 SQL لا يعيد مجهول الهوية ، فإن "MyDataview" قابلة للتحرير ، وهنا يأتي السؤال ...

السؤال هو: كيف أستمر في هذه التغييرات؟

هناك العشرات من الأحداث في DataGrid ، ولست متأكدًا من أي منها أكثر ملاءمة. حتى لو جربت أحد الأحداث ، ما زلت لا أعرف ما هو الكود الذي أحتاجه لتنفيذ لإرسال هذه التغييرات إلى DB من أجل استمرار التغييرات.

أتذكر مرة أخرى في أيام مجموعة بيانات ADO.NET ، ستفعل DataAdapter.update (DataSet) ؛

تخيل أيضًا أن كلا من الاسترداد والاستمرار () موجودون على طبقة عمل وأن توقيع الأسلوب يشبه هذا:

public void LoadMyDataGrid(DataGridView grid);

تأخذ هذه الطريقة شبكة النموذج وتملأها باستخدام استعلام LINQ2SQL الموضح أعلاه.

الآن أود إنشاء طريقة مثل هذه:

public void SaveMyDataGrid(DataGridView grid); // or similar

الفكرة هي أن هذه الطريقة ليست على نفس الفئة (النموذج) ، تميل العديد من الأمثلة إلى افتراض أن كل شيء معًا.

هل كانت مفيدة؟

المحلول

سيكون الحدث المهمل مكانًا جيدًا للتحقق لمعرفة ما إذا كان الوقت قد حان للاستمرار في التغييرات في قاعدة البيانات.

    this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowValidated);

    private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        MyLinq.Person person = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyLinq.Person;

        if (person != null)
        {
            // save this person back to data access layer
        }
    }

بعد تحريرك:

لن أعود إلى مثيل DataGrid إلى طبقة الخدمة الخاصة بك. كنت أعود IEnumerable<MyLinq.Person> أو IList<MyLinq.Person> ثم تكرار المجموعة في طبقة الخدمة الخاصة بك ، واعتمادًا على المنطق المنطق ؛ استمر في التغييرات على طبقة الوصول إلى البيانات (قاعدة البيانات الخاصة بك)

نصائح أخرى

طريقة "حفظ" على كائن datacontext SubmitChanges().

using (MyContext c = new MyContext())
{
     var q = (from p in c.People
             where p.Id == 1
             select p).First();
     q.FirstName = "Mark";
     c.SubmitChanges();
}

كما ذكر مايكل جي ، ستحتاج إلى جمع التغييرات ، ونقلها إلى كائن BLL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top