PDA

View Full Version : فیلتر کردن چند مرحله ای datagridview



sadeghpa80
یک شنبه 04 مهر 1395, 14:50 عصر
سلام توی پروژه ام حدود 20000 قلم کالا دارم
حالا میخوام این توی لیستی که به کاربر نشون میده یه تکست باکس دارم و بصورت کلی میتونه توی این تکست باکس سرچ کنه
اما میخوام جستجو رو جزئی تر کنم

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

میخوام توی مرحله اول طرف تایپ کنه پیچ با تایید لیست کالاهایی که توش پیچ داره رو نمایش بده
بعد تایپ کنه پلاستیکی
اون موقع لیستی از پیچ های پلاستیکی رو فقط بهش نشون بده
همین جوری پیش بره تا به کالای مورد نظرش برسه


دقیقا این کار رو توی برنامه همکاران سیستم هست که میتونی هر چیزی رو طبق خواسته خودت فیلتر کنی تا به مقصد برسی

ممنون

daniyaltjm
یک شنبه 04 مهر 1395, 15:50 عصر
سلام توی پروژه ام حدود 20000 قلم کالا دارم
حالا میخوام این توی لیستی که به کاربر نشون میده یه تکست باکس دارم و بصورت کلی میتونه توی این تکست باکس سرچ کنه
اما میخوام جستجو رو جزئی تر کنم

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

میخوام توی مرحله اول طرف تایپ کنه پیچ با تایید لیست کالاهایی که توش پیچ داره رو نمایش بده
بعد تایپ کنه پلاستیکی
اون موقع لیستی از پیچ های پلاستیکی رو فقط بهش نشون بده
همین جوری پیش بره تا به کالای مورد نظرش برسه


دقیقا این کار رو توی برنامه همکاران سیستم هست که میتونی هر چیزی رو طبق خواسته خودت فیلتر کنی تا به مقصد برسی

ممنون

سلام شما باید توی رویداد TextChanged تکست باکس از دستور Like اسکیوال استفاده کنی و با گذاشتن علامت % قبل یا بعد یا هم قبل و هم بعد اون رشته مورد نظر این سرچ آنلاین رو انجام بدی به این صورت:

"select Name,Family from Tbl_Cnt where Name like'" + "%" + txtSearch.Text + "%" + "' or Family like'" + "%" + txtSearch.Text + "%" + "' "

sadeghpa80
دوشنبه 05 مهر 1395, 09:32 صبح
سلام شما باید توی رویداد TextChanged تکست باکس از دستور Like اسکیوال استفاده کنی و با گذاشتن علامت % قبل یا بعد یا هم قبل و هم بعد اون رشته مورد نظر این سرچ آنلاین رو انجام بدی به این صورت:

"select Name,Family from Tbl_Cnt where Name like'" + "%" + txtSearch.Text + "%" + "' or Family like'" + "%" + txtSearch.Text + "%" + "' "

ممنون اما یا من نتونستم منظورم رو برسونم یا شما درست متوجه نشدیدی که من مشکلم چیه

من الان توی سرچ هیچ مشکلی ندارم با EF و خاصیت Containsو با یه تکست باکس داره سرچ انجام میشه

مشکل من اینجوریه که کاربر شاید اسم یه پیچ یا شماره پیچ یادش نباشه
مثلا میدونه دنبال پیچ داره میگرده و توی 20000 تا رکورد کالا تعداد پیچ ها 10000 تا رکورد هست

کاربر میاد سرچ میکنه پیچ و 10000 تا رکورد توی گرید بهش نمایش داده میشه
حالا میخوام سرچ بعدی رو توی اون 10000 تا رکورد انجام بشه

و مجدد میاد سرچ میکنه تمام رزوه حالا براش 2000 تا رکورد نمایش داده میشه
میخوام این سرچ توی 2000 تا رکورد انجام بشه نه کل رکورد ها

و همین جوری پیش بره

امیدوارم متوجه منظورم شده باشید
توی همکاران سیستم دقیقا به همین صورته اما اون با دلفی نوشته شده و نمیدونم این امکان توی C#‎‎‎‎‎‎ هم هست یا نه


خودم یه استدلالی دارم بنظرم باید بیام نتایج سرچ اول رو توی یه دیتا لیست بریزم
بعد سرچ دوم رو روی این دیتا لیست انجام بدم و مجدد نتایج رو توی یه دیتالیست دیگه بریزم و باز سرچ جدید رو توی این دیتالیست جدید انجام بدم تا آخر

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

ممنون

Mahmoud Zaad
دوشنبه 05 مهر 1395, 10:15 صبح
سلام
همینطوره که نوشتی، البته فقط یه لیست تعریف می کنی و هر بار که جستجو انجام میشه نتیجه رو علاوه بر اینکه نمایش میدی، توی این لیست قرارش می دی. یه چیزی مثل این (http://stackoverflow.com/questions/6353350/multiple-where-conditions-in-ef)

sadeghpa80
دوشنبه 05 مهر 1395, 11:02 صبح
سلام
همینطوره که نوشتی، البته فقط یه لیست تعریف می کنی و هر بار که جستجو انجام میشه نتیجه رو علاوه بر اینکه نمایش میدی، توی این لیست قرارش می دی. یه چیزی مثل این (http://stackoverflow.com/questions/6353350/multiple-where-conditions-in-ef)

ممنون میشم یه راهنمایی کنی مثلا چه نوع لیستی بسازم که بتونم نتیجه جستجوی رو بریزم توش
نتیجه جستجوی من لیست Enumerable هست

ممنون

Mahmoud Zaad
دوشنبه 05 مهر 1395, 11:31 صبح
مثل همین لینکی که گذاشتم. کد زیر سراسری تعریف میشه.

IQueryable _filterData;

حالا توی دکمه جستجو، اولین بار جستجو در دیتابیس انجام میشه نتیجه اش توی لیست بالا ریخته میشه و سری بعد در همین لیست:

_filterData=_filterData.Where(m=>m.Keyword.Contains(keyWordTextBox.Text));
dataGridView1.DataSource = _filterData

یعنی هر بار که جستجو انجام میشه نتیجه توی لیست مورد نظر ما قرار می گیره.

daniyaltjm
دوشنبه 05 مهر 1395, 11:32 صبح
ممنون اما یا من نتونستم منظورم رو برسونم یا شما درست متوجه نشدیدی که من مشکلم چیه

من الان توی سرچ هیچ مشکلی ندارم با EF و خاصیت Containsو با یه تکست باکس داره سرچ انجام میشه

مشکل من اینجوریه که کاربر شاید اسم یه پیچ یا شماره پیچ یادش نباشه
مثلا میدونه دنبال پیچ داره میگرده و توی 20000 تا رکورد کالا تعداد پیچ ها 10000 تا رکورد هست

کاربر میاد سرچ میکنه پیچ و 10000 تا رکورد توی گرید بهش نمایش داده میشه
حالا میخوام سرچ بعدی رو توی اون 10000 تا رکورد انجام بشه

و مجدد میاد سرچ میکنه تمام رزوه حالا براش 2000 تا رکورد نمایش داده میشه
میخوام این سرچ توی 2000 تا رکورد انجام بشه نه کل رکورد ها

و همین جوری پیش بره

امیدوارم متوجه منظورم شده باشید
توی همکاران سیستم دقیقا به همین صورته اما اون با دلفی نوشته شده و نمیدونم این امکان توی C#‎‎‎‎‎‎ هم هست یا نه


خودم یه استدلالی دارم بنظرم باید بیام نتایج سرچ اول رو توی یه دیتا لیست بریزم
بعد سرچ دوم رو روی این دیتا لیست انجام بدم و مجدد نتایج رو توی یه دیتالیست دیگه بریزم و باز سرچ جدید رو توی این دیتالیست جدید انجام بدم تا آخر

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

ممنون

سلام آخه این فکر نکنم زیاد جالب باشه چون عملیات I/O زیادی انجام میشه حالا اگه رکورد ها هم میلیونی باشه که دیگه هیچ!! خوب وقتی خود SQL دستور LIKE رو گذاشته چرا باید این کار رو بکنیم؟! خوب ولی اگه بخوای انجام بدی فکر کنم باید از جداول Temp اسکوال به عنوان واسط برای نگهداری رکورد ها استفاده کنی که من تاحالا انجام ندادم دوستان دیگه لطفا راهنمایی کنند.

Mahmoud Zaad
دوشنبه 05 مهر 1395, 11:49 صبح
سلام آخه این فکر نکنم زیاد جالب باشه چون عملیات I/O زیادی انجام میشه حالا اگه رکورد ها هم میلیونی باشه که دیگه هیچ!! خوب وقتی خود SQL دستور LIKE رو گذاشته چرا باید این کار رو بکنیم؟! خوب ولی اگه بخوای انجام بدی فکر کنم باید از جداول Temp اسکوال به عنوان واسط برای نگهداری رکورد ها استفاده کنی که من تاحالا انجام ندادم دوستان دیگه لطفا راهنمایی کنند.
ایشون با EF کار میکنن که Contianis شبیه همان Like هست. ولی کلیت حرفتون درسته و با یه جستجو به این لینک (http://www.dotnettips.info/post/473/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%DB%8C%D9%86-iqueryable-%D9%88-ienumerable-%D8%AF%D8%B1-%D8%AD%DB%8C%D9%86-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-orms) رسیدم که جواب سوال شما رو میده.

sadeghpa80
دوشنبه 05 مهر 1395, 14:38 عصر
سلام آخه این فکر نکنم زیاد جالب باشه چون عملیات I/O زیادی انجام میشه حالا اگه رکورد ها هم میلیونی باشه که دیگه هیچ!! خوب وقتی خود SQL دستور LIKE رو گذاشته چرا باید این کار رو بکنیم؟! خوب ولی اگه بخوای انجام بدی فکر کنم باید از جداول Temp اسکوال به عنوان واسط برای نگهداری رکورد ها استفاده کنی که من تاحالا انجام ندادم دوستان دیگه لطفا راهنمایی کنند.

ممنون اما من اطلاعاتی که یک بار خونده شده رو فقط مرور کنم و نمیخوام هر سری به دیتابیس وصل بشم
برای این مسئله هم دیتا یکبار توی dataTableAdabter و dataset لود شده و از همون استفاده میکنم

mr.sirwan
دوشنبه 05 مهر 1395, 14:47 عصر
دوست عزیز شما میتونی یک متغییر استرینگ تعریف کنی و هر سری که سرچ انجام میشه، فیلد جدید رو به این کوئری استرینگت اپند کنی و با EF اجراش کنی

sadeghpa80
سه شنبه 06 مهر 1395, 16:51 عصر
دوست عزیز شما میتونی یک متغییر استرینگ تعریف کنی و هر سری که سرچ انجام میشه، فیلد جدید رو به این کوئری استرینگت اپند کنی و با EF اجراش کنی

ممنون میشه یکم بیشتر توضیح بدید

black_fire667
پنج شنبه 15 مهر 1395, 20:41 عصر
ممنون میشه یکم بیشتر توضیح بدید

منظورش اینه که یه متغیر استرینگ تعریف میکنی و دفعه اول اینجوری مقداری دهی میشه :
Moteghayer = " select * from Table where Filed like '%" + TextBox.text + "%'
دفعه بعد میاید و متن جستجوی جدید رو به این شکل به استرینگتون اضافه می کنید!
Moteghayer = Moteghayer + " and Filed Like '%" + Textbox.text + "%'
اینجوری به مقصدتون می رسید