PDA

View Full Version : فیلتر روی گرید با linq



sepide_68_91
سه شنبه 06 تیر 1391, 12:57 عصر
سلام
دوستان من یک برنامه دارم که توی فرم اصلی یک گرید دارم
یک کلید فیلتر هم دارم
که وقتی کلید فیلتر رو میزنم یک فرم باز میشه که دارای پنج لیست باکس و پنج لیبل هست
که با توجه به مقادیر ستون های گرید اطلاعات در لیست ها بایند شده)
با انتخاب هر ایتم از لیست باکس ها اون ایتم توی لیبل مربوطه وارد میشه(تا اینجا مشکلی ندارم)
حالا
میخوام وقتی کاربر از لیست ها ایتمهای مورد نظرش رو انتخاب کرد (و ایتم ها وارد لیبل ها شدند) براساس ایتم های توی لیبل ها
با بسته شدن فرم دوم فیلتر بر روی گرید توی فرم اصلی اعمال بشه
اما نمیدونم باید توی کلید فیلتر روی فرم اصلی چی بنویسم که به این هدف برسم؟؟؟(البته با linq)
خواهش میکنم راهنمایی کنید(اگه نمونه ای دارید لطف کنید و بذارید)(لطفا)
ممنونم

tooraj_azizi_1035
سه شنبه 06 تیر 1391, 13:14 عصر
سلام

ابتدا کامپوننت BindingSource فرم اصلی رو public کن تا تو فرم فیلتر بتونی بهش دست پیدا کنی. بعد با استفاده از خاصیت Filter این کامپوننت رکوردها رو فیلتر کن:
http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter.aspx

با متد RemoveFilter فیلتر رو پاک کن.

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

gwbasic
سه شنبه 06 تیر 1391, 14:46 عصر
فرض می کنم شما از Linq To EF برای گرفتن اطلاعات از DataBase استفاده میکنید. همانطور که می دونید کوئری های Linq قابلیت deferred execution داره بنابراین در لحظه تعریف کوئری اجرا نمی شه و ما می تونیم شرط های بیشتر رو برای فیلتر کردن به کوئری اضافه کنید

var context = DataConext();
var query = context.Person;
if (!string.IsNullOrEmpty(lblName.Text)
{
query.Where(p=>p.Name == lblName.Text);
}
if (!string.IsNullOrEmpty(lblFamily.Text)
{
query.Where(p=>p.Family == lblFamily.Text);
}
var result = query.ToList();


فکر میکنم کد به اندازه کافی گویا باشه. شما با استفاده از یکسری شرط Where های بیشتری رو به query اضافه می کنید و در نهایت با استفاده از متد ToList کوئری به سمت database فرستاده می شود و نتیجه مطلوب حاصل می شود

sepide_68_91
سه شنبه 06 تیر 1391, 17:40 عصر
سلام
ممنونم ازتون
میشه خواهش کنم . روی یک نمونه کوچیک بهم نشونش بدید؟
(اخه ممکنه توی یک لیبل چند تا ایتم باشه و ستون مورد نظر باید براساس مثلا سه ایتم فیلتر بشه)

ممنون میشم

sepide_68_91
چهارشنبه 07 تیر 1391, 09:29 صبح
خوب جناب gwbasic (http://barnamenevis.org/member.php?25140-gwbasic) دو آیتمیش رو نشون دادند ، شما آیتم سوم رو با یک if دیگه اضافه کنید. در این جستجوی پیشرفته با خالی بودن هر لیبل شرط if برقرار نیست و اون لیبل در فیلتر اطلاعات شرکت نمیکنه.

سلام
ممنون
من این جوری نوشتم اما هیچ اتفاقی رخ نمیده و انگار نه انگار

Form2 d = new Form2();

d.ShowDialog();
testaDataContext Bank = new testaDataContext();
var query = Bank.t1s;
if (!string.IsNullOrEmpty(d.lbfilter.Text))
{
query.Where(p=>p.nam == d.lbfilter.Text );
}
if (!string.IsNullOrEmpty(d.lbfilter1.Text))
{
query.Where(p=>p.famil == d.lbfilter1.Text);
}
var result = query.ToList();

خواهش میکنم راهنمایی کنید
(راستی p توی کد چیه؟)

gwbasic
چهارشنبه 07 تیر 1391, 09:41 صبح
شما باید debug کنید ببینید که چه چیزی برگردونده می شه ببنید داخل result چی هست. اگر چیزی نیست احتمالا بر اساس فیلتر مورد نظر رکوردی برای برگرداندن وجود نداره. برای اینکه مطمئن بشین چیزی برگردانده می شه داخل فرم چیزی رو انتخاب نکنید تا لیبل ها خالی باشند و درنتیجه هیچکدام از where ها اجرا نشه و تمام رکوردهای موجود در t1s (این چه جور نامگذاریه!!!) برگردونده بشه.
در ضمن داخل where از عبارت لامبدا استفاده شده و p و یا هر نام دیگه ای رو که در نظر می گیرید نماینده اون type خواهد بود. عبارتهای لامبدا رو بررسی کنید

sepide_68_91
چهارشنبه 07 تیر 1391, 10:37 صبح
شما باید debug کنید ببینید که چه چیزی برگردونده می شه ببنید داخل result چی هست. اگر چیزی نیست احتمالا بر اساس فیلتر مورد نظر رکوردی برای برگرداندن وجود نداره. برای اینکه مطمئن بشین چیزی برگردانده می شه داخل فرم چیزی رو انتخاب نکنید تا لیبل ها خالی باشند و درنتیجه هیچکدام از where ها اجرا نشه و تمام رکوردهای موجود در t1s (این چه جور نامگذاریه!!!) برگردونده بشه.
در ضمن داخل where از عبارت لامبدا استفاده شده و p و یا هر نام دیگه ای رو که در نظر می گیرید نماینده اون type خواهد بود. عبارتهای لامبدا رو بررسی کنید

سلام
ممنون از راهنمایی تون
چک کردم مقدار result رو مینویسه count=2 لیبل ها هم مقدار خودشون رو دارند
بدون مقدارم چک کردم اما در هر صورت انگار نه انگار
شما نمونه ای ندارید لطف کنید و بذارید؟
ممنون میشم راهنمایی کنید

gwbasic
چهارشنبه 07 تیر 1391, 14:11 عصر
خوب حله دیگه result داده جدید شماست که فیلتر شده به گرید فرم بایند کنید

dataGridView.DataSource = result;

sepide_68_91
چهارشنبه 07 تیر 1391, 16:56 عصر
سلام
ممنون
اما
همچنان انگار نه انگار....!!!!!!!!!!!!بی تاثیره

sepide_68_91
پنج شنبه 08 تیر 1391, 09:30 صبح
سلام
دوستان کسی نمیدونه من باید چی بنویسم تا درست شه؟؟؟
ممنون میشم کمکم کنید:ناراحت:

sepide_68_91
پنج شنبه 08 تیر 1391, 09:30 صبح
سلام
دوستان کسی نمیدونه من باید چی بنویسم تا درست شه؟؟؟
ممنون میشم کمکم کنید:ناراحت:

aqawae
پنج شنبه 08 تیر 1391, 09:51 صبح
شما در فرم كه گريدويو است يك تابع تعريف كن كه كار فيلتر را انجام بده .دوما در در فرم كه گريد وجود دارد يك متغير پابليك و استاتيك از نوع خود فرم تعريف كن مثل public static frm_main frmp; سپس در رويداد لود همين فرم بنويس frmp=this; حالا بر توي فرم كه ليبل وجودارد توي رويداد كليك دكمه كه بر مگردي تو صفحه اي كه گريد ويو وجو دارد بنويس (...,frm_main .frmp.functionmame(label1.text,label.text

تابع بايد به صورت زير باشه:
public void filter(string a,string b(
{
var sql=db.table_a.where(p=>p.name==a && p.family==b,...(
datagridview1.datasource=sql;
}

gwbasic
جمعه 09 تیر 1391, 10:32 صبح
15 تا پست زده شده هنوز شما جواب نگرفتین!!! ببینین شما کد نوشتین بنابراین ما نمی دونمیم دقیقا چی نوشتین؟ خوب اگه می بینین به جواب نرسیدین کدتون رو بطور کامل بذارین اینجا...
این مورد رو هم بررسی کنید: وقتی result‌رو می خواین به گرید بایند کنین ابتدا Datasource‌ش رو خالی کنید

dataGridView.DataSource = null;
dataGridView.DataSource = result;

sepide_68_91
جمعه 09 تیر 1391, 17:48 عصر
سلام
من توی فرم فیلتر برا انتقال ایتم به لیبل این کد رو در select change لیست نوشتم

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if(listBox1.SelectedItem=!null)
{
label1.Text += listBox1.SelectedItem.ToString()+",";
}
else
{
label1.text="";
}
}

و در فرم اول در کلید فیلتر این کد رو
Form2 d = new Form2();

d.ShowDialog();

testaDataContext Bank = new testaDataContext();
var query = Bank.t1s;
if (!string.IsNullOrEmpty(d.lbfilter.Text))
{
query.Where(p=>p.nam == d.lbfilter.Text );
}
//if (!string.IsNullOrEmpty(d.lbfilter1.Text))
// {
// query.Where(p=>p.famil == d.lbfilter1.Text);
//}
var result = query.ToList();
dataGridView1.DataSource = null;
dataGridView1.DataSource = result;
بازم جواب نمیده..!!!!