PDA

View Full Version : سوال: مشکل جستجو وابسته به پر شدن textbox ها



hamedjonjon
جمعه 16 تیر 1391, 16:38 عصر
سلام
من یه فرم دارم که 5 تا textbox و یک datagridview و یک دکمه جستجو داره
dataGridView متصل به یک دیتابیس است که 5 فیلد متناظر با 5 تا textbox داخل فرم داره
میخوام برنامه ای بنویسم که کاربر با پر کردن هر کدام از textbox ها جستجو در دیتابیس را انجام دهد.
مثلا اگر textbox1 تنها پر شد, تنها براساس textbox1 جستجو را انجام دهد
اگر textbox1 و textbox2 پر شدند, براساس textbox1 و textbox2 جستجو را انجام دهد
اگر textbox2 و textbox5 پر شدند, براساس textbox2 و textbox5 جستجو را انجام دهد
و ...
اولین راهی که خودم به ذهنم رسید استفاده از if و else های زیاد است( با توجه به وجود 5 تا textbox تعداد if ها برابر 5! یعنی 125 تا می شود) که این کار به هیچ وجه اصولی نمی باشد

دومین راه :
فکر میکنم بتوان با استفاده از query صحیح نیز این کار را انجام داد
مثلا :

SELECT *FROM table
WHERE column1 = ??

آیا راهی وجود دارد که بتوان در صورتی که textbox خالی بود در قسمت where چیزی شبیه * قرار داد تا آن را بی اثر کند و تمام ردیف ها را برگرداند؟(البته خودم می دونم که * درست نیست)

لطفا اگر کسی تا بحال این کار را انجام داده است و یا ایده ای دارید کمک نمایید
سپاس گذارم

Beginner2013
جمعه 16 تیر 1391, 17:19 عصر
سلام.می تونی بررسی کنی که اگر TextBox ای خالی بود در کد Sql در شرط مربوط به اون TextBox یک or 1=1 اضافه کنی.

veniz2008
جمعه 16 تیر 1391, 18:24 عصر
سلام،یه ایده به ذهنم رسید که واست یه چیزی رو نوشتم( من هر 5 فیلد رو رشته ای در نظر گرفتم، شما بر حسب نیازت اصلاح کن)،همچنین برای اینکه کوئری نهایتا خالی نباشه یکی از شرطها رو اجباری کردم( میتونید یکی از فیلدهای جدولت رو که بی تاثیر هست و در همه رکوردها یکسان هست به جای شرط اجباری بزاری . کد رو تست کنید و نتیجه رو اعلام کنید.ممکنه یه روز به درد یه نفر دیگه هم بخوره.
موفق باشید.


string s = "select * from tblname where [filde yeksan] ='meghdare fild'";
if (textBox1.Text != "")
s += "'and username ='" + textBox1.Text.Trim();
if (textBox2.Text != "")
s += "' and family ='" + textBox2.Text.Trim();
if (textBox3.Text != "")
s += "' and phone ='" + textBox3.Text.Trim();
if (textBox4.Text != "")
s += "' and Address = '" + textBox4.Text.Trim();
if (textBox5.Text != "")
s += "' and city = '" + textBox5.Text.Trim();
s += "'";
SqlConnection con = new SqlConnection("Data Source=(local);Initial Catalog=KHODRO;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter(s, con);
con.Open();
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count != 0)
dataGridView1.DataSource = dt;
else
MessageBox.Show("هیچ رکوردی یافت نشد");
con.Close();

hamedjonjon
شنبه 17 تیر 1391, 09:07 صبح
ممنون از راهنمایی شما
این روش درسته و جواب میده اما مشکل من اینه که در داده های فارسی جدول خالی برمیگرداند
مثلا این query با وجود داشتن نام "حامد" در ستون "donator" دیتابیس هیچ ردیفی را بر نمی گرداند

SELECT *
FROM Table
Where donator = 'حامد'


اما اگر "ali" که به صورت انگلیسی نوشته شده باشد را وارد کنم درست کار می کند

SELECT *
FROM Table
Where donator = 'ali'

veniz2008
شنبه 17 تیر 1391, 09:30 صبح
سلام، برای داده های فارسی یه حرف N ( با حرف بزرگ ) قبل از رشته بذار یعنی اینطوری(اینطوری هم فارسی ها هم انگلیسی ها رو نشون میده):

"select * from table where donator = N'" + textBox1.Text + "'"

hamedjonjon
شنبه 17 تیر 1391, 10:01 صبح
آقا محمد انصافا دمت گرم
مشکل ما رو حل کردی
خدا خیرت بده

اما یه سوال:
چرا با استفاده از N مشکل فارسی حل میشه؟
این روش برای محیط ویژوال استودیو استفاده میشه یا مخصوص تمام محیط هاست(و از اصول query نوشتنه) ؟

iman_me
شنبه 17 تیر 1391, 11:15 صبح
:متعجب:

این همه کد واسه یه کار به این سادگی
خوب یه تابع میزاشتی:لبخند:

hamedjonjon
شنبه 17 تیر 1391, 11:35 صبح
:متعجب:

این همه کد واسه یه کار به این سادگی
خوب یه تابع میزاشتی:لبخند:

لطفا اگه میخواهید راهنمایی نمایید لطفا منظورتونو واضح بیان کنید
ممنونم

veniz2008
شنبه 17 تیر 1391, 12:03 عصر
چرا با استفاده از N مشکل فارسی حل میشه؟
این روش برای محیط ویژوال استودیو استفاده میشه یا مخصوص تمام محیط هاست(و از اصول query نوشتنه) ؟
در این مورد داخل سایت خیلی بحث شده، لطفا جستجو کنید.


:متعجب:

این همه کد واسه یه کار به این سادگی
خوب یه تابع میزاشتی:لبخند:
خوشحال میشم کد کمتر و بهینه تری رو ارائه بدید.

sobijoon
شنبه 17 تیر 1391, 14:54 عصر
میشد انتخاب فیلد رو در داخل یک کمبو در اختیار کاربر میزاشتید و با یه دستور case مقدار valuemember رو با تو جه به selectedvalue تعیین میکردی و دستور select رو بصورت زیر تغییر میدادید
"select * from"+ combobox1.valuemember+"where donator = N'" + textBox1.Text + "'"

اگه متوجه نشدید بگید تا بشتر توضیح بدم

veniz2008
شنبه 17 تیر 1391, 15:11 عصر
میشد انتخاب فیلد رو در داخل یک کمبو در اختیار کاربر میزاشتید و با یه دستور case مقدار valuemember رو با تو جه به selectedvalue تعیین میکردی و دستور select رو بصورت زیر تغییر میدادید
"select * from"+ combobox1.valuemember+"where donator = N'" + textBox1.Text + "'"

اگه متوجه نشدید بگید تا بشتر توضیح بدم
اگر میخواستن بر اساس یک فیلد جستجو کنن حرف شما صحیح بود ولی دوستمون میخواستن که همزمان بتونن براساس چند فیلد جستجو داشته باشن.

sobijoon
شنبه 17 تیر 1391, 16:04 عصر
بله.
میتونه از این روش هم استفاده کنه
private void textBox4_TextChanged(object sender, EventArgs e)
{
if (textBox4.Text != String.Empty)

dw.RowFilter = "ln like '%" + textBox4.Text.Trim() + "%'";
else

dw.RowFilter = "";
}
برای هر کدوم از تکس باکس ها

mfathi
دوشنبه 09 بهمن 1391, 17:27 عصر
بله.
میتونه از این روش هم استفاده کنه
private void textBox4_TextChanged(object sender, EventArgs e)
{
if (textBox4.Text != String.Empty)

dw.RowFilter = "ln like '%" + textBox4.Text.Trim() + "%'";
else

dw.RowFilter = "";
}
برای هر کدوم از تکس باکس ها

آقا dw اینجا چیه؟