PDA

View Full Version : سوال: جستجوی پیشرفته



kingtak
چهارشنبه 13 دی 1391, 19:54 عصر
سلام دوستان
من توی برنامم یه منوی جستجو گذاشتم که با چند تا شرط جستجو می کنه.همونطور که میبینید از2 تا کمبوباکس استفاده کردم.
من می تونم بر اساس یکی از کمبوباکسها سرچ کنم.میخواستم ببینم چطور باید از کمبوباکس دومی و چک باکس استفاده کنم.
سوال دوم:
میشه به جای اینهمه شرط یه کد خلاصه نوشت؟آخه اینجوری کدم خیلی زیاد شده!

97760

private void brnSearch_Click(object sender, RoutedEventArgs e)
{

LibraryDataContext db = new LibraryDataContext();

if (txtSearch.Text != string.Empty)
{
if (cmbConfine.SelectedIndex == 0)
{
var query = db.BookTables
.Where(p => p.bName.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;
}
else if (cmbConfine.SelectedIndex == 1)
{
var query = db.BookTables
.Where(p => p.author.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;
}
else if (cmbConfine.SelectedIndex == 2)
{
var query = db.BookTables
.Where(p => p.publisher.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;
}
else if (cmbConfine.SelectedIndex == 3)
{
var query = db.BookTables
.Where(p => p.translator.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;
}
else if (cmbConfine.SelectedIndex == 4)
{
var query = db.BookTables
.Where(p => p.printDate.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;
}
}
}

samadblaj
چهارشنبه 13 دی 1391, 20:08 عصر
سلام از and , or استفاده کنید :

else if (cmbConfine.SelectedIndex == 1 && combobox2.selectedindex ==1)
{
var query = db.BookTables
.Where(p => p.author.Contains(txtSearch.Text) || p.Fild2.Contains(txtSearch.Text) );
dataGrid2.ItemsSource = query;
}

به نظر منم این راه کد های زیادی نیاز داره اگه روش بهتر و بهینه تری پیدا بشه خیلی مناسبتره... استفاده از view هم میتونه مناسب باشه.

alias136790
چهارشنبه 13 دی 1391, 20:16 عصر
ببین نگاه
توی دستور linq برای اینکه از 2 شرط استفاده کنی بین دو شرط & بذار:
Where(c=>c.bName == Value & c.author = Value)
بجای استفاده چندباره از If، از Switch استفاده کن
switch(cmbConfine.SelectedIndex )
{
case 1:
....
breake;
case 2:
...
break;
}

GoodLuck

kingtak
چهارشنبه 13 دی 1391, 20:26 عصر
سلام از and , or استفاده کنید :

else if (cmbConfine.SelectedIndex == 1 && combobox2.selectedindex ==1)
{
var query = db.BookTables
.Where(p => p.author.Contains(txtSearch.Text) || p.Fild2.Contains(txtSearch.Text) );
dataGrid2.ItemsSource = query;
}

به نظر منم این راه کد های زیادی نیاز داره اگه روش بهتر و بهینه تری پیدا بشه خیلی مناسبتره... استفاده از view هم میتونه مناسب باشه.
آخه 5 تا شرط دارم اگه بخوام به روشی که شما معرفی کردید کار کنم باید توی هر شرطم برای کمبوباکس اول همه شرط های کمبوبتکس دوم رو برسی کنم که میشه یه دنیا کد.(کمبوباکس اول 5 تا اندیس داده و دومی 4 تا)5^4
درسته؟
اگه برای کم کردن کد ها راه حلی دارید ممنون میشم کمکم کنید.


استفاده از view هم میتونه مناسب باشه.

میشه بگید view چیه؟:متعجب:

samadblaj
چهارشنبه 13 دی 1391, 20:50 عصر
آخه 5 تا شرط دارم اگه بخوام به روشی که شما معرفی کردید کار کنم باید توی هر شرطم برای کمبوباکس اول همه شرط های کمبوبتکس دوم رو برسی کنم که میشه یه دنیا کد.(کمبوباکس اول 5 تا اندیس داده و دومی 4 تا)5^4
درسته؟
اگه برای کم کردن کد ها راه حلی دارید ممنون میشم کمکم کنید.

شاید راه های وجود داشته باشه اما بعید میدونم...
این شروط رو سرعت شما تاثیر نداره تا زمانی که آخر هر if تون یه breack قرار بدید در بعد از گردش خارج میشه....

اگر فیلتر شما از طرف sql باشه سرعت بهتری خواهد داشته در هنگام طراحی table یه قسمت هست به نام view که میتونید جدول هاتون رو بهش اضاف کنید و فیلتر های مورد نظر رو اعمال کنید و view رو دخیره کنید بعد view ایجاد شده رو به همون شکل که توی model یا کلاس table هاتون رو کلاس sql اضاف میکنید در اون قسمت view های ایجاد شده رو اضاف کنید و توی گرید یا آیتم خاص اعمال کنید....

testEntities db = new testEntities();
dataGridView1.DataSource = db.View1;

asghar2008
چهارشنبه 13 دی 1391, 22:45 عصر
سلام


هر 2تا گزینه رو به CheckBox تبدیل کن. 2 تا چک باکس به نام های محدوده - نوع مدرک
اگه کاربر هر یک از چک باکس هارو انتخاب کرد ComboBox اش فعال بشه...

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

1- اگر چک باکس محدوه تیک خورده - دستورات اون اجرا بشه .با Select case بهتره استفاده کنی.
2-اگر چک باکس نوع مدرک تیک خورده - دستورات اون اجرا بشه .
3-اگر هر دوتا چک باکس تیک خورده .جستجو براساس فیلدهای انتخاب شده انجام گیرد.من از این روش استفاده می کنم.

به عنوان مثال عکس زیر رو نگاه کن:


97765


البته اون چک باکس (جستجوی همه موارد) ، یه سوال داشتم:

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

samadblaj
چهارشنبه 13 دی 1391, 23:15 عصر
سلام داش اصغر این روشی هم که شما فرمودید دوباره همون ک های فیلتر رو نیار داره

1- اگر چک باکس محدوه تیک خورده - دستورات اون اجرا بشه .با Select case بهتره استفاده کنی.
اینجا نیاز به فیلتـــــر داره...

هر چند که فرق میکنه اما مشکل سر این نیست و ...

var query = db.BookTables.Where(p => p.bName.Contains(txtSearch.Text));
dataGrid2.ItemsSource = query;


اگر میشد bname بعد از انتخاب هر آیتم به آیتم خودش تغییر کنه تقریبا روی بیستر آیتم ها مشکل حل بود...

kingtak
چهارشنبه 13 دی 1391, 23:22 عصر
البته اون چک باکس (جستجوی همه موارد) ، یه سوال داشتم:

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

[/CENTER]
بله دوست عزیز یعنی همه فیلد هارو جستجو منه که تو این حالت باید کمبو باکس هارو در نظر نگیره
البته با روش شما اگه کاربر هیچ کدوم از چک باکس هارو انتخاب نکنه به این معنیه که توی همه فیلد ها جستجو کنه یا میتونیم طوری تنظیم کنیم که به طور پیشفرض تو اسم کتاب ها جستحو کنه.درسته؟

asghar2008
چهارشنبه 13 دی 1391, 23:46 عصر
بله دوست عزیز یعنی همه فیلد هارو جستجو منه که تو این حالت باید کمبو باکس هارو در نظر نگیره
البته با روش شما اگه کاربر هیچ کدوم از چک باکس هارو انتخاب نکنه به این معنیه که توی همه فیلد ها جستجو کنه یا میتونیم طوری تنظیم کنیم که به طور پیشفرض تو اسم کتاب ها جستحو کنه.درسته؟

بله. درسته.

بازم بهتره دوستان دیگه نظرات و روش های خودشونو ارائه بدن . آخر سر جمع بندی کنی و روشی که به نظر دوستان بهتره استفاده کنی.