PDA

View Full Version : اضافه کردن سطر به صورت دستی به BindingSource برای بروزرسانی datagridview



negar.rafie
پنج شنبه 28 مرداد 1395, 12:42 عصر
سلام
من از Entity Framework‌برای کار با پایگاه داده استفاده میکنم
حالا با استفاده از BindingSource میام و گرید خودم از جدول پر میکنم
حالا مشکلم اینه که وقتی یک سطر جدید به جدول اضافه میکنم میخوام به دیتاگرید هم اضافه بشه
حالا چون با استفاده از BindingSource دیتاگرید را پر میکنم با تغییر در BindingSource دیتاگرید هم بروز رسانی میشه
ولی نمیخوام دوباره کل اطلاعات را دوباره لود کنم داخل BindingSource
میخوام همون یک سطر اضافه بشه به BindingSource
یا اصلا ایا این روش BindingSource درست است؟یا روش دیگه ای هست
ممنون

Mahmoud.Afrad
پنج شنبه 28 مرداد 1395, 21:44 عصر
ابتدا از طریق شئ Context و موجودیت مورد نظر DBSet<T> (اگر شرطی برای لود اطلاعات دارید اعمال کنید) سپس متد Load را فراخوانی کنید. بعد، از طریق پراپرتی Local و فراخوانی متد ToBindingList دیتاسورس BindingSource را پر کنید و به دیتاگرید نسبت دهید. در اینصورت بعد از اضافه شدن آیتم جدید، دیتاگرید هم آپدیت میشه.
https://blogs.msdn.microsoft.com/efdesign/2010/09/08/data-binding-with-dbcontext

negar.rafie
پنج شنبه 28 مرداد 1395, 23:48 عصر
ممنون راستش درست متوجه نشدم
میشه یه مثال بزنید
فرض کنید نام چدول ما tabel1 هستش
و نام مدل ما که نمونه ازش میسازم برای دسترسی به جداول dbTestEntites هستش
درضمن من از طریق یک فرم دیگر رکورد اضافه میکنم
و همینطور اگر یک رکورد را حذف کنم یا ویرایش ایا به همین روش باید عمل کنم

Mahmoud.Afrad
جمعه 29 مرداد 1395, 00:35 صبح
در فرم1 دیتاگرید رو به صورت زیر پر کنید
private Database1Entities _dbTestEntites;

public Form1()
{
InitializeComponent();

BindingSource bindingSource = new BindingSource();
_dbTestEntites = new Database1Entities();
_dbTestEntites.Tabel1.Load();
bindingSource.DataSource = _dbTestEntites.Tabel1.Local.ToBindingList();
dataGridView1.DataSource = bindingSource;
}
در فرمهای دیگر که قرار هست تغییری در دیتابیس داده بشه، در متد سازنده پارامتری از نوع مدل دیتابیس ایجاد کنید تا بتونید تغییرات را روی این شئ از مدل(حذف، اضافه و آپدیت) اعمال کنید.
مثال
private Database1Entities _dbTestEntites;
public Form2( Database1Entities dbEntities)
{
InitializeComponent();

_dbTestEntites = dbEntities;
}

private void button1_Click(object sender, EventArgs e)
{
Tabel1 t = new Tabel1
{
// set properties
};
_dbTestEntites.Tabel1.Add(t);
_dbTestEntites.SaveChanges();
}

negar.rafie
جمعه 29 مرداد 1395, 13:25 عصر
ممنون
حالا اگر بخوام شرط اعمال کنم چکار کنم
همبنطور من نمیخوام همه ستون ها را لود کنم و بعضی از اونها را میخوام
کداش را نوشتم و چیزی لود نمیکنه

mr.sirwan
جمعه 29 مرداد 1395, 14:43 عصر
کد شرطتون رو بذارین مشاهده کنیم، همچنین کد اعمال شرط و انتخاب ستون به این صورت هست:

_dbTestEntites.Tabel1.Where(/*شرط*/).Select(current=> new {current.ستون_موردنظر})

negar.rafie
جمعه 29 مرداد 1395, 15:46 عصر
کدهام همینطوریه

mr.sirwan
جمعه 29 مرداد 1395, 16:05 عصر
بعد از Select از Load یا ToList و... استفاده میکنین؟؟
لطفا کدتون رو بذارید

negar.rafie
جمعه 29 مرداد 1395, 17:59 عصر
ازLoad استفاده میکنم
tolist هم نمیشه

negar.rafie
شنبه 30 مرداد 1395, 10:43 صبح
البته با اعمال شرط مشکلی ندارم
با انتخاب ستون های دلخواه مشکل دارم
در ضمن وقتی بار اول که نرم افزار اجرا میشه و رکوردی داخل جدول نیست و میخوام رکورد اضافه کنم ارور میده

Operation is not valid due to the current state of the object.

negar.rafie
شنبه 30 مرداد 1395, 18:41 عصر
چرا هیچ کس بلد نیست؟
الانی مشکل دیگه ای پیدا کردم برای جستجو باید چکار کنم؟
دوباره داده ها را از دیتابیس فراخوانی کنم یا نه از همین ToBindingList میتونم استفاده کنم
اخه وقتی از ToBindingList استفاده میکنم نصف ستونهام از گرید ناپدید میشن
خواهشا اگر از اساتید کسی بلده جواب بده
جناب Mahmoud.Afrad هم ک انلاین شدند ولی جواب ندادند

negar.rafie
شنبه 30 مرداد 1395, 19:56 عصر
این کد لود منه که اگر ستون های دلخواه را بخوام انتخاب کنم نمیشه و چیزی بر نمیگردونه

db.tbl1.Where(c => c.Code == txt1.Text).Select(x=>x.Name ).Load();
bi.DataSource = db.tbl1.Local.ToBindingList();
dgrid.DataSource = bi;

اینم کد سرچ ک وقتی پیدا کنه بعضی از ستون ها ناپدید میشه و وقتی پیدا نکنه یک سری ستون های دیگه اضافه میکنه
bi.DataSource = db.tbl1.Local.ToBindingList().Where(x => x.Code == txt1.Text);
dgrid.DataSource = bi;

در ضمن وقتی بار اول که نرم افزار اجرا میشه و رکوردی داخل جدول نیست و میخوام رکورد اضافه کنم ارور میده

Operation is not valid due to the current state of the object.

mr.sirwan
شنبه 30 مرداد 1395, 21:26 عصر
شما درخواست کمک از دوست عزیزمون آقا محمود رو کردین ولی با اجازه چیزی که توی کداتون میبینم رو میگم:

کد لودتون به ظاهر که باید درست کار کنه چیزی به ذهنم نمیرسه، بهترین راه Trace کردن برنامه و استفاده از BreakPoint هستش و اینکه همین کد رو به کد SQL برگردونین و داخل SQLServer امتحان کنین، ضرر نداره

درمورد کد سرچتون باید قبل از متد ToBindingList شرطتون رو اعمال کنین درحالیکه شما بعد از این متد شرط رو گذاشتین

درمورد ارور موقع درج، نمیشه نظر قطعی داد، باید کد Insert رو بذارین اشکال توو کدتون هست

negar.rafie
شنبه 30 مرداد 1395, 21:44 عصر
ن من فقط از ایشون درخواست کمک نکردم گفتم انلاین شدن ولی جواب ندادن البته نمیگم حتما باید جواب میدادن
کد جستجو را قبلش ک بنویسیم ارور میده

bi.DataSource = db.tbl1.Where(x => x.Code == txt1.Text).Local.ToBindingList();
dgrid.DataSource = bi;

mr.sirwan
شنبه 30 مرداد 1395, 21:46 عصر
متد Where رو بعد از Local و قبل از ToBindingList بذارین

negar.rafie
شنبه 30 مرداد 1395, 21:53 عصر
اینطوری دیگه نمیشه از ToBindingList استفاده کرد
نمیشناسه
البته ToBindingList را برمیدارم میشه
ولی مشکلی که هست اینه که وقتی موردی نباشه همه ستون ها را از گرید پاک میکنه و یک ستون با نام current اضافه میکنه

mr.sirwan
شنبه 30 مرداد 1395, 22:07 عصر
اگه مقدوره و میتونین برای کد سرچتون به جای TobindingList از Tolist استفاده کنین، درغیر اینصورت باید قبل از Load کردن داده ها، اونارو فیلتر و شرطتون رو اعمال کنین

negar.rafie
شنبه 30 مرداد 1395, 22:23 عصر
این کد درج منه

tbl1 t= new tbl1
{
code= txt1.Text,
Name = txt2.Text,
};
db.tbl1.Add(t);
db.SaveChanges();

مشکل چیه وقتی جدول خالی است ارور میده

Operation is not valid due to the current state of the object.

Mahmoud.Afrad
شنبه 30 مرداد 1395, 22:49 عصر
مخفی کردن یک ستون که با تغییر visible ستون قابل حل هست.
اگر از متد tolist استفاده کردید، اضافه و حذف را روی bindingsource هم انجام بدید تا تغییر روی دیتاگرید نمایان بشه.
نمونه زیر رو ببینید.
اگر به متد nameof خطای زمان کامپایل گرفت با رشته معادل جایگذین کند. نمونه بایند به تکست باکس با جستجو در همین سایت میتونید ببینید.
اگر به پکیج EntityFramework خطا گرفت یکبار از طریق nuget این پکیج رو آپدیت کنید.
اگر به کانکشن و نام سرور خطا گرفت نام Instance سرور و ... رو در App.config اصلاح کنید.

negar.rafie
شنبه 30 مرداد 1395, 23:28 عصر
اگر از روش بالا استفاده کنم برای ویرایش چکار کنم؟
بعد کدوم بهتره اون اولی که گفتید یا این؟

این ارور را نمیدونید برای چی هستش؟
Operation is not valid due to the current state of the object.

negar.rafie
یک شنبه 31 مرداد 1395, 09:20 صبح
سورس را دوباره دیدم
برگشتیم سر پله اول
یعنی لود کردن مجدد کل اطلاعات جدول

بهتره دیگه ادامه ندیم
ممنون از شما Mahmoud.Afrad و mr.sirwan به خاطر جواب هاتون

mr.sirwan
یک شنبه 31 مرداد 1395, 10:06 صبح
اشکالش چیه که اطلاعاتی که مورد نیازتون هستش رو از دیتابیس Load کنین نه از BindingSource، این همه دردسر هم نخواهین داشت

واسه ارور Operation is not valid due to the current state of the object یک احتمال هستش اینکه نسخه .netframework مربوط به پروژه هاتون باهم مطابقت نمیکنن، شما بررسی بفرمایین که .netframework مربوط به Models و یا هر پروژه دیگه ای که به Solution اضافه کردین باهم برابر باشن، مثلا اگه پروژه اصلیتون نسخه .net برابر 4.5 باشه باید بقیه پروژه ها رو هم بذارین رو همین نسخه

negar.rafie
یک شنبه 31 مرداد 1395, 10:15 صبح
خب استفاده از BindingSource روش اصولی هستش

من کلا یک پروژه دارم اونم ورژن دات نت 4.5 هستش

negar.rafie
یک شنبه 31 مرداد 1395, 10:34 صبح
الان اومدم و از Tolist استفاده کنم و مثل سورسی که جناب محمود گذاشتن ولی بازم وقتی جدول خالی باشه همون ارور را میده
یعنی کسی بلد نیست
Operation is not valid due to the current state of the object.