PDA

View Full Version : سوال: ایجاد فیلتر برای ستونی از نوع int در BindingSource



hosseines
دوشنبه 22 شهریور 1395, 12:07 عصر
با عرض سلام و تبریک عید قربان
من با استفاده از کد زیر تونستم در ستون دیتاگرید از نوع رشته ای جستجو انجام بدم ولی در ستونی که داده از نوع int یا number جواب نمیده.

DataTable datatable1 = new DataTable();
BindingSource binding1 = new BindingSource();
binding1.DataSource = dt;
dgList.DataSource = binding1;

private void txJFaliat_TextChanged(object sender, EventArgs e)
{
binding1.Filter = string.Format("KodJFaliat like '%{0}%'", txJFaliat.Text);
}

mrprestige
دوشنبه 22 شهریور 1395, 16:50 عصر
سلام دوست من ، بنده هم این عید بزرگ رو به شما و باقی دوستان تبریک میگم . دوست عزیز این خط رو به این صورت اصلاح کن ببین جواب میده

binding1.Filter = string.Format("KodJFaliat like '%{0}%'",Convert.Toint32( txJFaliat.Text ));

hosseines
دوشنبه 22 شهریور 1395, 23:50 عصر
سلام دوست من ، بنده هم این عید بزرگ رو به شما و باقی دوستان تبریک میگم . دوست عزیز این خط رو به این صورت اصلاح کن ببین جواب میده

binding1.Filter = string.Format("KodJFaliat like '%{0}%'",Convert.Toint32( txJFaliat.Text ));


ممنون دوست عزیز
جواب نداد..

mrprestige
سه شنبه 23 شهریور 1395, 20:03 عصر
مجددا سلام دوست من ، خب برای این کار از یه روش دیگه استفاده میکنیم به این صورت که داخل کلاس Form به این صورت بنویسید

SqlConnection _con = new SqlConnection(" کانکشن استرینگ");
SqlDataAdapter AD;
DataTable _dt;


و داخل رویداد Text_Changed اینو بنویس

_con.Open();
AD = new SqlDataAdapter("select * from TableName where KodJFaliat like ' " + Convert.ToInt32(textBox1.Text.Trim()) + "%'", _con);
_dt = new DataTable();
AD.Fill(_dt);
dataGridView1.DataSource = _dt;
_con.Close();


باز اینو خودت میتونی بهینه تر بنویسی الان چون وقت نداشتم (با عرض معذرت) فقط خواستم بدونی اصل کد چطوریه .

پیروز و موفق باشی

Imenam
سه شنبه 23 شهریور 1395, 23:37 عصر
سلام
کد را به صورت زیر اصلاح کنید:


binding1.Filter = string.Format("Convert(KodJFaliat , 'System.String') like '%{0}%'", txJFaliat.Text);

rahmatipoor
چهارشنبه 24 شهریور 1395, 17:21 عصر
دوست عزیز چون ستونت از نوع int هست نمیتونی از عملگر like استفاده کنی ، باید از عملگر = استفاده کنی

mrprestige
چهارشنبه 24 شهریور 1395, 17:40 عصر
دوست عزیز چون ستونت از نوع int هست نمیتونی از عملگر like استفاده کنی ، باید از عملگر = استفاده کنی

سلام دوست من وقتت بخیر ، دوست عزیز میتونم بپرسم رو چه استنباطی این رو می فرمایید ؟؟ خب الان من از Like استفاده کردم و جواب هم داده ستون هم از نوع int بوده .

hosseines
چهارشنبه 24 شهریور 1395, 20:34 عصر
ممنون
فقط یه سوالی اگر بخوام همزمان براساس دو فیلد جستجو کنم باید چکار کنم..؟

Mahmoud.Afrad
چهارشنبه 24 شهریور 1395, 23:33 عصر
ممنون
فقط یه سوالی اگر بخوام همزمان براساس دو فیلد جستجو کنم باید چکار کنم..؟

لینک زیر توضیح دادم
http://barnamenevis.org/showthread.php?375223-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D8%A7%D8%B2-%DA%86%D9%86%D8%AF-%D9%81%DB%8C%D9%84%D8%AF&p=1658419&viewfull=1#post1658419

rahmatipoor
پنج شنبه 25 شهریور 1395, 12:25 عصر
سلام دوست من وقتت بخیر ، دوست عزیز میتونم بپرسم رو چه استنباطی این رو می فرمایید ؟؟ خب الان من از Like استفاده کردم و جواب هم داده ستون هم از نوع int بوده .

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


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

همونطوری که آقای مدیر فرمودند از کلمه کلیدی and توی رشته filter String استفاده کنید و یک یا چند شرط دیگه هم بنویسید

mrprestige
پنج شنبه 25 شهریور 1395, 14:53 عصر
همونطوری که آقای مدیر فرمودند از کلمه کلیدی and توی رشته filter String استفاده کنید و یک یا چند شرط دیگه هم بنویسید
دوست من لطفا در ارسال جواب دقت کنید شما که الان فرمودید با Like نمیشه و باید از عملگر = استفاده کرد . خب جناب استاد Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) هم که از Like استفاده کردند (اون هم به چند روش) دوست من . جوابتون دوپهلو و ناآگاهنه بود اینطور جواب ها باعث میشه اون بنده خدا که سوال مطرح کرده توی دریافت جوابش دچار مشکل بشه . امیدوارم از انتقادم ناراحت نشید دوست من . چون مثلا منی که مبتدی ام و اینجا ( یا کلا در این سایت ) سوالم رو مطرح میکنم میخوام که به یک جواب اصولی برسم .

امیدوارم پیروز و موفق باشید دوست عزیز.

rahmatipoor
جمعه 26 شهریور 1395, 11:57 صبح
دوست خوبم آقایmrprestige (http://barnamenevis.org/member.php?338119-mrprestige)
ازتون تشکر میکنم که تذکر میدید به دوستان چون باعث پیشرفت میشه
من هم ناراحت نشدم و خوشحال شدم
اما در مورد مطالبی که فرمودید :
اولا کدی که آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) توی پست های بالا لینکش رو دادند ، اینه ( که میتونید خودتون مراجعه کنید ببینید ) :

string filter = string.Empty;
if (txtName.Text.Trim() != string.Empty)
{
filter += "name like '%" + txtName.Text.Trim() + "%' and ";
}
if (txtLastName.Text.Trim() != string.Empty)
{
filter += "lastname like '%" + txtLastName.Text.Trim() + "%' and ";
}
// check another textboxes
filter += " 1=1 ";
dt.DefaultView.RowFilter = filter;
اولا :
دقت کنید ایشون عملگر like رو برای ستونهای name و lastname استفاده کردند که از نوع رشته هستند نه int
filter += "name like '%" + txtName.Text.Trim() + "%' and ";
filter += "lastname like '%" + txtLastName.Text.Trim() + "%' and ";
من گفتم like رو نمیشه روی ستون int استفاده کرد قبلا کلی باهاش سر و کله زدم همینطوری الکی نگفتم .
شما گفتید عملگر like رو برای ستون از نوع int استفاده کردید ، من رو به شک انداختید. ( بنده مطلبی رو که مطمئن نباشم سعی میکنم نگم )



همچنین کدی هم که این دوستمون گفتند رو ببینید:


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

binding1.Filter = string.Format("Convert(KodJFaliat , 'System.String') like '%{0}%'", txJFaliat.Text);

دقت کنید ایشون با استفاده از دستور Convert ابتدا مقدار ستون رو که از نوع int بوده ، تبدیل به string کردند بعد دستور like رو استفاده کردند :
Convert(KodJFaliat , 'System.String')


الآن با این تفاصیل احتمال میدم که شما اشتباه کردید و روی ستون از نوع int نبوده ، احتمالا یه ستون رشته ای بوده که توش عدد ذخیره کردید.
ازتون خواهش میکنم بدون دقت همینطوری کسی رو متهم به منحرف کردن دیگران نکنید.


دوما :
میشه بفرمایید که این مطلبی که من توی پست بعدی گفتم ( نقل قول زیر ) ایرادش چیه:


همونطوری که آقای مدیر فرمودند از کلمه کلیدی and توی رشته filter String استفاده کنید و یک یا چند شرط دیگه هم بنویسید

Imenam
جمعه 26 شهریور 1395, 12:33 عصر
ممنون
فقط یه سوالی اگر بخوام همزمان براساس دو فیلد جستجو کنم باید چکار کنم..؟


binding1.Filter = string.Format("Convert(KodJFaliat, 'System.String') LIKE '%" + txJFaliat.Text + "%' And XXXXX LIKE '%" + XXX.Text + "%' ");

mrprestige
جمعه 26 شهریور 1395, 16:14 عصر
عرض سلام و ادب دوست خوبم ،
در جواب فرمایش اولتون لازم بود بگم دوسته من ، جناب استاد افراد با اون مثالی که زدند هم میتونید با ستون int هم کار کنید تنها تفاوتش اینه که فقط باید سینگل کوتیشن رو حذف کنید یا ورودیتون رو تبدیل به int کنید (با دستور Convert ) و اینکه فرمودید بنده احتمالا ستونم رو از نوع رشته گرفتم در جواب بگم که نه دوست من همچین کاری اصلا اصولی نیست

با این حال دوست خوبم همیشه موفق باشی

mr.sirwan
جمعه 26 شهریور 1395, 21:57 عصر
با عرض سلام و عرض ادب به دوستان گرامی، این تاپیک دیگه خیلی داره کش پیدا میکنه موافقین؟ :) :لبخند: با اجازه همگی باید بگم که حق با دوست خوبمون mrprestige (http://barnamenevis.org/member.php?338119-mrprestige) هستش برای ستونی از نوع int هم میشه از عملگر Like استفاده کرد، ولی باید دقت داشته باشیم، مقداری که میخوایم جستجو کنیم اولا حتما باید داخل سینگل کوتیشن باشه و دوما اینکه حتما باید حداقل از یک عملگر % (حالا چه ابتدا، چه انتها و چه در هر دو طرف مقدار موردنظر - که البته بسته به نوع جستجوتون هستش دیگه) استفاده کرد...
و اینکه به جای این بحثا جواب این بنده خدارو کامل بدین :تشویق::لبخند:

از مدیرای محترم هم عذر میخوام که این پست رو گذاشتم، ولی فقط به این خاطر بود که تاپیک زیاد طولانی نشه و کش پیدا نکنه :گیج::گیج:

Mahmoud.Afrad
جمعه 26 شهریور 1395, 22:43 عصر
سلام دوست من ، بنده هم این عید بزرگ رو به شما و باقی دوستان تبریک میگم . دوست عزیز این خط رو به این صورت اصلاح کن ببین جواب میده

binding1.Filter = string.Format("KodJFaliat like '%{0}%'",Convert.Toint32( txJFaliat.Text ));

Convert.Toint32 در این کد یک چیز اضافه هست چون در نهایت مقدار باید به رشته الحاق بشه و میتونید متن تکست باکس رو فقط الحاق کنید مگر اینکه نیاز داشته باشید قبل از این کد عدد بودن عبارت تکست باکس رو چک کنید.


اصولا Like برای پیدا کردن رشته ای هست که شبیه عبارت بعد از Like هست، پس می بایست مقدار عددی با Convert تبدیل به رشته و سپس مقایسه انجام بشه.
https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx
از لینک بالا برای RowFilter هم میشه استفاده کرد.

حالا اگر دوستان mrprestige (http://barnamenevis.org/member.php?338119-mrprestige) و mr.sirwan (http://barnamenevis.org/member.php?369257-mr-sirwan) تونستند بدون تبدیل و بدون خطا این کار رو انجام بدن یک توضیح همراه با کد قرار بدن.

mr.sirwan
جمعه 26 شهریور 1395, 23:02 عصر
مثالی که من استفاده کردم...

این دیزاین جدولم:
142643

اینم کوئری و نتایجش:
142644

Mahmoud.Afrad
جمعه 26 شهریور 1395, 23:13 عصر
مثالی که من استفاده کردم...

این دیزاین جدولم:
142643

اینم کوئری و نتایجش:
142644

بحث در مورد sql نیست. در مورد خصوصیت Filter از بایندینگ سورس هست.

rahmatipoor
شنبه 27 شهریور 1395, 17:56 عصر
Convert.Toint32 در این کد یک چیز اضافه هست چون در نهایت مقدار باید به رشته الحاق بشه و میتونید متن تکست باکس رو فقط الحاق کنید مگر اینکه نیاز داشته باشید قبل از این کد عدد بودن عبارت تکست باکس رو چک کنید.


اصولا Like برای پیدا کردن رشته ای هست که شبیه عبارت بعد از Like هست، پس می بایست مقدار عددی با Convert تبدیل به رشته و سپس مقایسه انجام بشه.
https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx
از لینک بالا برای RowFilter هم میشه استفاده کرد.

حالا اگر دوستان mrprestige (http://barnamenevis.org/member.php?338119-mrprestige) و mr.sirwan (http://barnamenevis.org/member.php?369257-mr-sirwan) تونستند بدون تبدیل و بدون خطا این کار رو انجام بدن یک توضیح همراه با کد قرار بدن.

با تشکر از استاد Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) عزیز

لینکهای زیر رو ببینید:
http://stackoverflow.com/questions/18462376/like-operator-for-integer
http://stackoverflow.com/questions/2924894/sql-server-like-for-integer

این هم توضیح سایت مایکروسافت در مورد عملگر like :
The LIKE operator determines whether or not a character string matches a specified pattern

توی این آدرسها :

(https://msdn.microsoft.com/en-us/library/bb208897(v=office.12).aspx)https://msdn.microsoft.com/en-us/library/aa392263(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/bb208897(v=office.12).aspx

mrprestige
شنبه 27 شهریور 1395, 20:13 عصر
Convert.Toint32 در این کد یک چیز اضافه هست چون در نهایت مقدار باید به رشته الحاق بشه و میتونید متن تکست باکس رو فقط الحاق کنید مگر اینکه نیاز داشته باشید قبل از این کد عدد بودن عبارت تکست باکس رو چک کنید.


اصولا Like برای پیدا کردن رشته ای هست که شبیه عبارت بعد از Like هست، پس می بایست مقدار عددی با Convert تبدیل به رشته و سپس مقایسه انجام بشه.
https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx
از لینک بالا برای RowFilter هم میشه استفاده کرد.

حالا اگر دوستان mrprestige (http://barnamenevis.org/member.php?338119-mrprestige) و mr.sirwan (http://barnamenevis.org/member.php?369257-mr-sirwan) تونستند بدون تبدیل و بدون خطا این کار رو انجام بدن یک توضیح همراه با کد قرار بدن.
عرض سلام و ادب خدمت استاد بزرگوار Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) ؛
لازمه عرض کنم خدمتتون جناب افراد بنده طبق پست شماره 4 (http://barnamenevis.org/showthread.php?529918-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%AA%D9%88%D9%86%DB%8C-%D8%A7%D8%B2-%D9%86%D9%88%D8%B9-int-%D8%AF%D8%B1-BindingSource&p=2340877&viewfull=1#post2340877) پاسخ دوست عزیزمون جناب hosseines (http://barnamenevis.org/member.php?u=171296) رو دادم و گویا مورد تایید ایشون هم بود این هم تصاویری از اجرای کد بهمراه جدول بنده
142654


142655

و این هم و از Design جدول

142656

حالا جناب افراد شما میفرمایین که از طریق Query نباشه . ولی بنده از این کدم هم جواب گرفتم

var dataTable = dataGridView1.DataSource as DataTable;
if (dataTable != null)
dataTable.DefaultView.RowFilter = $"ID = '{Convert.ToInt32(textBox1.Text.Trim())}'";


و همینطور

BindingSource bs = new BindingSource();
bs.DataSource = dataGridView1.DataSource;
bs.Filter = $"convert(ID, 'System.String') Like '%{Convert.ToInt32(textBox1.Text.Trim())}%' ";
dataGridView1.DataSource = bs;


حالا اگه بنده قسمتی رو اشتباه کردم خیلی خوشحال میشم بفرمایین تا ایراد کار رو برطرف کنم .

rahmatipoor
شنبه 27 شهریور 1395, 20:31 عصر
پاسخی که شما دادید اینه :





_con.Open();
AD = new SqlDataAdapter("select * from TableName where KodJFaliat like ' " + Convert.ToInt32(textBox1.Text.Trim()) + "%'", _con);
_dt = new DataTable();
AD.Fill(_dt);
dataGridView1.DataSource = _dt;
_con.Close();


شما یک کوئری نوشتید و از طریق دیتا اداپتر به اس کیو ال ارجاع دادید و نتیجه رو برگردوندید.

بحث دوستی که سوال پرسیده روی فیلتر کردن دیتاگرید بود که بر می گرده به خاصیت فیلتر مربوط به باندینگ سورس دیتاگرید

در این خصوص پست شماره 5 جواب صحیح هست که اون هم ابتدا مقدار ستون رو با استفاده از دستور Convert به رشته تبدیل کردند