PDA

View Full Version : جستجوی هوشمند در TextBox (همانند جستجو گوگل)



mehrdad1991h
چهارشنبه 25 بهمن 1391, 22:48 عصر
سلام
یه لیست از یه سری داده داریم که مثلا تو یه لیست باکس ، کمبو باکس یا هرچیز دیگه ای که بهتر باشه:افسرده: داخل برنامه قرار میدیم
(بانک اطلاعاتی مثل SQL , ....نمیخوایم استفاده کنیم)
الان میخوایم در یک تکست باک مثلا کاربر اگر حرف A را زد مثلا 5 تا داده اولی که با حرف A شروع شدن را پیدا کنه و یه منو زیر تکست باکس باز بشه و به کاربر نمایش داده بشه و اگر کاربر رفت روش و انتخابش کرد وارد تکست باکس بشود ! (دقیقا نمونش میشه مثل تکست باکس جستجوی گوگل)
حالا نکته اینجاست که اگر مثلا کلمه وارد کرد در اون لیستی که داریم جستجو انجام یشه و اگر کلمه هر جایی از متن بود اون متن را نشون میده

مثال
مثلا کلمه ی "گل" در تکست باکس وارد شده و قراره به طور مثال 5 داده اولی که داخلشون گل پیدا شد را به صورت لیستی زیر تکست باکس نمایش بدیم
به فرض این که در لیست داده هایمون 10 تا داده داریم که توش کلمه ی گل هست به طور مثال این 5 تا نمایش داده میشه
ارامش گل زیبا
خواب گل
گل ابی
گلگیر ماشین
گل نیلوفر

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

سپاس

(داده ها به تریتیب حروف مرتب بشوند)

khokhan
چهارشنبه 25 بهمن 1391, 23:13 عصر
درود بر شما

اینم لینکش عزیز دل برادر :لبخند:

http://www.c-sharpcorner.com/UploadFile/mahesh/AutoCompletion02012006113508AM/AutoCompletion.aspx

http://www.codeproject.com/Articles/16942/AutoComplete-TextBox

mehrdad1991h
چهارشنبه 25 بهمن 1391, 23:22 عصر
درود بر شما

اینم لینکش عزیز دل برادر :لبخند:

http://www.codeproject.com/Articles/16942/AutoComplete-TextBox

ممنون ولی این ظاهرا خودش اومده گفته گر کاربر این کلمه ها را زد اینجوری بشه (برای مثال شما اگر حرف A را بزنی هیچی نمیاد ولی اگر Az بزنی یه چند مورد نشون میده چون AZ را در لیستش قرار داده)
من برا یه لیست که شامل 35 هزار تا خط میشه و قراره تو این 35 هزار خط جستجو انجام بشه بیام چقدر چیز بنویسم ؟

khokhan
چهارشنبه 25 بهمن 1391, 23:45 عصر
اینم از نمونه ای که خودم ساختمش
البته باید فارسی تایپ کنید ودیگه اینکه همه حروف فارسی رو ننوشتم واینکه میشه کامش کرد وازش یه dll ساخت

Mahmoud.Afrad
چهارشنبه 25 بهمن 1391, 23:58 عصر
البته تکست باکس ، اول کلمات رو مقایسه میکنه و فقط کلماتی که با متن وارد شده شروع بشن رو نشون میده.

برای بدست آوردن همه عباراتی که شامل حروف وارد شده باشند از کمبوباکس استفاده کنید. همه مقادیر رو در یک لیست رشته ای ذخیره کنید. بعد مقادیری که شامل حروف وارد شده هستند رو جدا کرده به کمبو اضافه کنید و منوی آبشاری رو نشون بدید:

List<string> lstSource;
List<string> lstItemsForAdd;
private void Form1_Load(object sender, EventArgs e)
{
lstSource = new List<string>();
lstSource.AddRange(new string[] { "ارامش گل زیبا", "آرامش", "کبوتر", "بهار", "زمستان", "گل نیلوفر", "گلگیر ماشین", "گل ابی", "خواب گل" });
}
private void comboBox1_TextUpdate(object sender, EventArgs e)
{
comboBox1.Items.Clear();
if (!string.IsNullOrEmpty(comboBox1.Text))
{
lstItemsForAdd = lstSource.Where(item => item.Contains(comboBox1.Text)).ToList();
lstItemsForAdd.Insert(0, string.Empty);
comboBox1.Items.AddRange(lstItemsForAdd.ToArray()) ;
lstItemsForAdd.Clear();
comboBox1.Select(comboBox1.Text.Length, 0);
comboBox1.DroppedDown = true;
}
}

mehrdad1991h
پنج شنبه 26 بهمن 1391, 00:42 صبح
ممنون از هردوی شما
ولی در کل روش دوم یعنی روش جناب Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) خیلی برای من کار امد تر است ظاهرا
بازم ازشون تشکر میکنم

فقط 2 تا مشکل اینجا دارم با این روش
1- اگر با حرف A مثلا 10000 تا کورد باشه همه را نشون میده :) چجوری میشه این دارپ دان را کنترلش کرد که مثلا فقط 10 تا اول را نشون بدهد ؟
2 - وقتی دراپ دانِ کمبوباکس باز میشه نشانگر موس میپره میره داخل کمبوباکس و حالت انتخابی را ایجاد میکنه (فک کنم همون فوکوس بشه !) حالا جلوی این را هم میشه گرفت که نشانگر نره و حالت عادی خودش را حفظ کنه ؟ (اینجوری که میپره یه جورای اجباری میشه انتخاب !)
<برای به ترتیب حروف بدون هم فکر میکنم باید یه تابع بنویسیم که قبل از اینکه مقادیر رو در لیست رشته ای ذخیره کنه اونا را مرتب کنه ! درسته ؟>
بعد یه سوال این کاری که میخوام بکنم برای چیزی حدود 35 هزار خط داده (دقیقا اسم 34550 اسم فیلم!) اصولیه ؟ یعنی زمانگیر نمیشه و کند بشه ؟ پیشنهادی چیزی دارین ؟ سپاس
سپاس

Mahmoud.Afrad
پنج شنبه 26 بهمن 1391, 02:47 صبح
برای نشون دادن فقط 5 تا میتونی Take(5) رو اضافه کنی. برای مرتب سازی هم OrderBy(item => item).

lstItemsForAdd = lstSource.Where(item => item.Contains(textBox1.Text)).Take(5).OrderBy(item => item).ToList();




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

List<string> lstSource;
List<string> lstItemsForAdd;
private void Form1_Load(object sender, EventArgs e)
{
listBox1.Width = textBox1.Width;
listBox1.Left = textBox1.Left;
listBox1.Top = textBox1.Bottom;
listBox1.Hide();
lstSource = new List<string>();
lstSource.AddRange(new string[] { "ارامش گل زیبا", "آرامش", "کبوتر", "بهار", "زمستان", "گل نیلوفر", "گلگیر ماشین", "گل ابی", "خواب گل" });
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
listBox1.Items.Clear();
if (!string.IsNullOrEmpty(textBox1.Text))
{
lstItemsForAdd = lstSource.Where(item => item.Contains(textBox1.Text)).Take(5).ToList();
if (lstItemsForAdd != null)
{
listBox1.Items.AddRange(lstItemsForAdd.ToArray());
listBox1.Show();
}
lstItemsForAdd.Clear();
}
else
{
listBox1.Hide();
}
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Text = Convert.ToString(listBox1.SelectedItem);
listBox1.Hide();
textBox1.Focus();
textBox1.Select(textBox1.Text.Length, 0);
}

hossein_sh2008
پنج شنبه 26 بهمن 1391, 08:25 صبح
با سلام خدمت دوستان

به نظر من روش كامبو باكس ارجعيت بيشتري داره ولي اين روشها زماني كارايي بيشتري دارند كه داده ها رو از بانك بخونن نه ما دستي بهشون اضافه كنيم،آيا يكي از دوستان نمونه اي از تلفيق بانك با اين كامبو باكس يا تكست باكس داره كه در اختيار همه قرار بده


با تشكر از زحماتتون

mehrdad1991h
پنج شنبه 26 بهمن 1391, 14:38 عصر
اقا اینجوری فایده نداره من داده هام خیلی زیاده 35 هزار تا هست و این باعث میشه برنامه هنگ کنه ....
یک راه حل میخوام که نمیدونم بر اساس بیشترین سرچ یا نمیدونم بر یه اساسی 5 مورد را نشون بدهد و یه جوری باشه که نخواد کل 35 هزار تا را سرچ کنه
یه برنامه کوچیک که بخواد 35 هزار تا را چک کنه برا این که یه اسم به کاربر نشون بده و این اسم نشون دادن 2 ساعت طول بکشه که به درد نمیخوره !!!!

من چه کنم ؟
لطفا کمک

Mahmoud.Afrad
پنج شنبه 26 بهمن 1391, 15:04 عصر
این اطلاعات کجا ذخیره میشه؟
میتونی اطلاعات را در دیتاتیبل لود کنید و دیتاتیبل را فیلتر کنید.

khokhan
پنج شنبه 26 بهمن 1391, 15:08 عصر
اقا اینجوری فایده نداره من داده هام خیلی زیاده 35 هزار تا هست و این باعث میشه برنامه هنگ کنه ....
یک راه حل میخوام که نمیدونم بر اساس بیشترین سرچ یا نمیدونم بر یه اساسی 5 مورد را نشون بدهد و یه جوری باشه که نخواد کل 35 هزار تا را سرچ کنه
یه برنامه کوچیک که بخواد 35 هزار تا را چک کنه برا این که یه اسم به کاربر نشون بده و این اسم نشون دادن 2 ساعت طول بکشه که به درد نمیخوره !!!!

من چه کنم ؟
لطفا کمک


درود برشما

یه دیتابیس xml چاره کار توست همه رو می ریز ی توش وبراساس حرف اول اسامی اطلاعات رو فیلتر می کنی

والسلام نامه تمام :لبخند:

mehrdad1991h
پنج شنبه 26 بهمن 1391, 15:49 عصر
این اطلاعات کجا ذخیره میشه؟
میتونی اطلاعات را در دیتاتیبل لود کنید و دیتاتیبل را فیلتر کنید.

جایی ذخیره نمیشن !!!! به صورت پیش فرض در لیست باکس یا کمبوباکس در برنامه میخوام قرارشون بدم ! و وقتی شروع کرد به تایپ در تکست باکس نام اینا را بهش نشون بده


درود برشما

یه دیتابیس xml چاره کار توست همه رو می ریز ی توش وبراساس حرف اول اسامی اطلاعات رو فیلتر می کنی

والسلام نامه تمام :لبخند:
این اطلاعات را من الان از یه فایل xml دارم استخراج میکنم بعد از 3 ساعت تازه 15664 تا نام از بین 34550 تا در اورده !!!! (دارم نام ها را جدا میکنم که در لیست باکسی کمبوباکسی چیزی در برنامه بریزمشون)
حالا میشه واضح تر بگید باید چی کار کرد ، البته فکر نکنم اینی که میگی فایده داشته باشه چون باید بیاد ک فایل xml را بخونه دوباره و خود اینم زمان بر است !!!! ضمن این که با این حالتی که شما گفتید فقط به حرف اول حساس میشه و دیگه کلمه اگه بین دو کلمه ی دیگه قرار بگیره دیگه نمیتونه از xml دربیاره چون به ترتیب حروف مرتب شده و نمیدونه کجا را باید بگرده ...:متفکر:

الان چیزی به ذهنتون میرسه ؟

mehrdad1991h
پنج شنبه 26 بهمن 1391, 16:25 عصر
مگر چطوری اطلاعات رو از xml میخونی که 3 ساعت طول کشیده هنوز پردازش تموم نشده. کدی که اطلاعات رو از فایل xml میخونی را همراه نمونه اطلاعاتی که داخل فایل xml هست را بزارید.

این کدی که من استفاده کردم


int a = 0;
String xml = "";
String link = "link.......show.xml";
WebClient webClient = new WebClient();
xml = webClient.DownloadString(link);
XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(xml));
List<ResultItem> results = new List<ResultItem>();

if (doc.DocumentElement.HasChildNodes)
{

XmlNodeList series = doc.DocumentElement.ChildNodes;

foreach (XmlNode serie in series)
{
XmlNodeList infos = serie.ChildNodes;
for (int i = 0; i < infos.Count; i++)
{
if (infos[i].Name == "name")
{

textBox1.Text += infos[i].InnerText + " , ";
a++;
break;
}
}
}
}


اینم کلاسی هست که ازش استفاده کردم

class ResultItem
{
private String ShowName;
public ResultItem(String showname)
{
this.ShowName = showname;
}
public String SName
{
get { return ShowName; }
}
}


اینم XML


http://services.tvrage.com/feeds/show_list.php

اینم نمونه کدش


<show><id>1</id><name>Fernwood 2Night</name><country>US</country><status>2</status></show>

khokhan
پنج شنبه 26 بهمن 1391, 16:58 عصر
راه دیگه اینه که :
می تونی یه کانورتور بسازی و ایکی ثانیه همه فایلو بریزی توی sql بعد از اون هم دیگه همه چیز حله :لبخند:

mehrdad1991h
پنج شنبه 26 بهمن 1391, 17:28 عصر
راه دیگه اینه که :
می تونی یه کانورتور بسازی و ایکی ثانیه همه فایلو بریزی توی sql بعد از اون هم دیگه همه چیز حله :لبخند:

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

Mahmoud.Afrad
پنج شنبه 26 بهمن 1391, 19:40 عصر
اگر اطلاعات فایل xml ثابت هست یکبار دانلود و در فایل ذخیره کنید تا دفعات بعد نیاز به دانلود نباشه.
یک شئ برای نگهداری سند xml و یک لیست برای نتیجه جستجو در سطح کلاس تعریف کنید:

XDocument xdoc;
List<string> lstItemsForAdd;

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

listBox1.Width = textBox1.Width;
listBox1.Left = textBox1.Left;
listBox1.Top = textBox1.Bottom;
listBox1.Hide();

string xmlPath = System.IO.Path.Combine(Application.StartupPath, "show_list.xml");
if (!File.Exists(xmlPath))
{
string xmlData = null;
string link = "http://services.tvrage.com/feeds/show_list.php";
using (WebClient webClient = new WebClient())
{
xmlData = webClient.DownloadString(link);
xdoc = XDocument.Load(new StringReader(xmlData));
xdoc.Save(xmlPath);
}
}
else
{
xdoc = XDocument.Load(xmlPath);
}


برای جستجو در سند xml هم اصلا نیاز به اون حلقه for نیست. کافیه از متدهای کلاس xdoc استفاده کنید.
یعنی به جای کد زمانگیر زیر

if (doc.DocumentElement.HasChildNodes)
{
......}


فقط یک خط کافیه
lstItemsForAdd = xdoc.Descendants("name").Where(item => item.Value.Contains(textBox1.Text)).Select(item => item.Value).Take(5).OrderBy(item => item).ToList();
متد Descendants عمل جستجو در کل سند رو انجام میده. به همین راحتی.
سرعتش هم بسیار بالاست و تقریبا همون لحظه جواب رو بدست میاره.

FastCode
جمعه 27 بهمن 1391, 10:45 صبح
میتونی از sqlite استفاده کنی.کاربر هم مجبور نیست چیزی نصب کنه.
اگر هم میخواهی حتماً فایل XML باشه میتونی تبدیل کنی به SQLite و از یک دیتابیس درون حافظه استفاده کنی.


در ضمن روش جست و جویی که استفاده میکنید خیلی خیلی بده.همتون.
http://stackoverflow.com/questions/2313363/what-is-the-algorithm-to-search-an-index-for-multiple-values?rq=1

mehrdad1991h
جمعه 27 بهمن 1391, 11:10 صبح
میتونی از sqlite استفاده کنی.کاربر هم مجبور نیست چیزی نصب کنه.
اگر هم میخواهی حتماً فایل XML باشه میتونی تبدیل کنی به SQLite و از یک دیتابیس درون حافظه استفاده کنی.


در ضمن روش جست و جویی که استفاده میکنید خیلی خیلی بده.همتون.
http://stackoverflow.com/questions/2313363/what-is-the-algorithm-to-search-an-index-for-multiple-values?rq=1

اصلا اسراری برا این نداریم که از XML استفاده بشه
فقط میخوام جوری باشه که کاربر نیاز نباشه کاری کنه و راحت به نتیجه برسه
روش شما هم خوبه ولی من تا الان با ایین چیزی که شما میگی برخورد نکردم که بتونم در اون سطح حرفه ای کار انجام بدم و الگوریتمی بهتر از این بلد نبودم
روش جناب Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) هم ظاهرا کارامد هستش و میشه ازش استفاده کرد (از ایشون هم تشکر میکنم بابت وقتی که گذاشتن)
ولی دیگه در همین حد علم ما بوده ...!!! یا شاید واقعا بالاتر از این نیاز نبوده ؟ نمیدونم
اگر امکانش هست میتونید نمونه ای چیزی قرار دهید شما هم ؟
سپاس

FastCode
جمعه 27 بهمن 1391, 13:51 عصر
اصلا اسراری برا این نداریم که از XML استفاده بشه
فقط میخوام جوری باشه که کاربر نیاز نباشه کاری کنه و راحت به نتیجه برسه
روش شما هم خوبه ولی من تا الان با ایین چیزی که شما میگی برخورد نکردم که بتونم در اون سطح حرفه ای کار انجام بدم و الگوریتمی بهتر از این بلد نبودم
روش جناب Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud.Afrad) هم ظاهرا کارامد هستش و میشه ازش استفاده کرد (از ایشون هم تشکر میکنم بابت وقتی که گذاشتن)
ولی دیگه در همین حد علم ما بوده ...!!! یا شاید واقعا بالاتر از این نیاز نبوده ؟ نمیدونم
اگر امکانش هست میتونید نمونه ای چیزی قرار دهید شما هم ؟
سپاس
توی اون لینک باید نمونش باشه.
اگر خودتون سعی کنید بنویسیدش خیلی بهتره چون توی مسیرتون ممکنه به خیلی چیزهای جالبتر مثل Merge Joinهای Hybrid یا FTS یا حتی استفاده از CUDA در جست و جو هم بر بخورید که مطالعشون واقعاً مفبده.

راستش رو بخواهید من خیلی فرصتش رو هم ندارم.

mehrdad1991h
یک شنبه 29 بهمن 1391, 01:01 صبح
در این خط من چه کنم که به حروف کوچک و بزرگ حساس نباشد ؟
میدونم از این متد
StringComparison.OrdinalIgnoreCase
باید استفاده کنم
ولی کجای این خط :

lstItemsForAdd = xdoc.Descendants("name").Where(item => item.Value.Contains(textBox1.Text)).Select(item => item.Value).Take(5).OrderBy(item => item).ToList();


میشه ازش استفاده کرد ؟
راهی هست که بشه به حروف کوچیک و بزرگ توجه نکنه ؟

FastCode
یک شنبه 29 بهمن 1391, 01:37 صبح
الان IDE ندارم.ساعت دو صبحه.
Contains(textBox1.Text
میتونه بشه
Exists(T=>T.WhatEver....

احتمالاً Exists اشتباهه.نمیدونم اسم تابعش چی بود.مغزم دیگه کار نمیکنه

mehrdad1991h
یک شنبه 29 بهمن 1391, 02:03 صبح
الان IDE ندارم.ساعت دو صبحه.
Contains(textBox1.Text
میتونه بشه
Exists(T=>T.WhatEver....

احتمالاً Exists اشتباهه.نمیدونم اسم تابعش چی بود.مغزم دیگه کار نمیکنه
Press ENTER to look up in Wiktionary or CTRL+ENTER to look up in Wikipedia

ممنون که همینم جواب دادین ولی در اینجا فقط چندتا چیز میشه استفاده کرد که به کار ما نمیان مثل
Equals - Except و...... که اینا هم به درد اینجا نمیخورن

اگرم این را میگین
Exists(element => element
اینم ماله لیسته اینجا نمیشه استفاده کرد یا شایدم من بلد نیستم ولی نشد !

Mahmoud.Afrad
یک شنبه 29 بهمن 1391, 02:35 صبح
از متد tolower استفاده کنید. هم متن تکست باکس و هم هر کدام از item ها :

string strSearch = textBox1.Text.ToLower();
lstItemsForAdd = xdoc.Descendants("name")
.Where(item => item.Value.ToLower().Contains(strSearch))
.Select(item => item.Value)
.Take(5)
.OrderBy(item => item)
.ToList();

moory1364
پنج شنبه 20 تیر 1392, 17:27 عصر
شاید به درد دوستان بخوره

private void radTextBox7_TextChanged(object sender, EventArgs e)
{
try
{
radTextBox7.AutoCompleteMode = AutoCompleteMode.Suggest;
radTextBox7.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection col = new AutoCompleteStringCollection();
col.AddRange(new string[]
{
"بانک ملت",
"بانک رفاه کارگران",
"بانک مسکن",
"بانک سپه",
"بانک کشاورزي",
"بانک ملي ايران",
"بانک تجارت",
"بانک صادرات ايران",
"پست بانک ايران",
"بانک توسعه تعاون",
"بانک پارسیان",
"بانک قرض الحسنه مهر ایران",
"بانک دی"
});
radTextBox7.AutoCompleteCustomSource = col;

}
catch
{
}
}

m_karimi
یک شنبه 10 دی 1396, 00:36 صبح
البته تکست باکس ، اول کلمات رو مقایسه میکنه و فقط کلماتی که با متن وارد شده شروع بشن رو نشون میده.

برای بدست آوردن همه عباراتی که شامل حروف وارد شده باشند از کمبوباکس استفاده کنید. همه مقادیر رو در یک لیست رشته ای ذخیره کنید. بعد مقادیری که شامل حروف وارد شده هستند رو جدا کرده به کمبو اضافه کنید و منوی آبشاری رو نشون بدید:

List<string> lstSource;
List<string> lstItemsForAdd;
private void Form1_Load(object sender, EventArgs e)
{
lstSource = new List<string>();
lstSource.AddRange(new string[] { "ارامش گل زیبا", "آرامش", "کبوتر", "بهار", "زمستان", "گل نیلوفر", "گلگیر ماشین", "گل ابی", "خواب گل" });
}
private void comboBox1_TextUpdate(object sender, EventArgs e)
{
comboBox1.Items.Clear();
if (!string.IsNullOrEmpty(comboBox1.Text))
{
lstItemsForAdd = lstSource.Where(item => item.Contains(comboBox1.Text)).ToList();
lstItemsForAdd.Insert(0, string.Empty);
comboBox1.Items.AddRange(lstItemsForAdd.ToArray()) ;
lstItemsForAdd.Clear();
comboBox1.Select(comboBox1.Text.Length, 0);
comboBox1.DroppedDown = true;
}
}


با سلام و تشکر از پاسخ خوبتان

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

وقتی کلید بک اسپیس تا آخر زده می شود و کل نوشته پاک میشود و از اول نوشته می شود، طول کمبوباکس خیلی کوتاه است. میخواستم طول کمبوباکس 10 شود. منظور از طول کمبوباکس اینکه اگر داده های داخل کمبو باکس بیش از ده تااست کمبوباکس اسکرول بخورد نه اینکه یک کمبوباکس طولانی بدون اسکرول باز شود.. کد زیر را نوشتم ولی در اولین اجرا جواب میدهد ولی بعد از کلید بک اسپیس و تایپ دوباره کلمه، طول کمبوباکس 1 می شود.
comboBoxEx1.IntegralHeight = false;
comboBoxEx1.MaxDropDownItems = 20;
comboBoxEx1.DropDownStyle = ComboBoxStyle.DropDown;

این کد پر کردن لیست از بانک
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=.;Initial Catalog=pp;Integrated Security=True";
SqlDataReader dr;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "select * from personel";
con.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
lstSource.Add(dr["name_personel"].ToString());
}


con.Close();

Mahmoud.Afrad
دوشنبه 11 دی 1396, 06:00 صبح
با سلام و تشکر از پاسخ خوبتان

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



بدست آوردن ID متناظر با آیتم انتخابی از ComboBox (http://barnamenevis.org/showthread.php?529807-بدست-آوردن-ID-متناظر-با-آیتم-انتخابی-از-ComboBox)

m_karimi
دوشنبه 11 دی 1396, 13:55 عصر
بدست آوردن ID متناظر با آیتم انتخابی از ComboBox (http://barnamenevis.org/showthread.php?529807-بدست-آوردن-ID-متناظر-با-آیتم-انتخابی-از-ComboBox)

یک مشکل اینکه این روش لیست که به کار بردم، اشاره گر موس روی فرم ظاهر نمیشود.

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

Mahmoud.Afrad
دوشنبه 11 دی 1396, 17:32 عصر
m_karimi (http://barnamenevis.org/member.php?18638-m_karimi) به جای استفاده از sqldatareader و اضافه کردن به لیست ، طبق کد تاپیک " بدست آوردن ID متناظر با آیتم انتخابی از ComboBox (http://barnamenevis.org/showthread.php?529807-بدست-آوردن-ID-متناظر-با-آیتم-انتخابی-از-ComboBox)" از datatable استفاده کنید و اونو به دیتاسورس کمبوباکس بدید. باید displaymember و valuemember را هم ست کنید.

m_karimi
دوشنبه 11 دی 1396, 20:48 عصر
m_karimi (http://barnamenevis.org/member.php?18638-m_karimi) به جای استفاده از sqldatareader و اضافه کردن به لیست ، طبق کد تاپیک " بدست آوردن ID متناظر با آیتم انتخابی از ComboBox (http://barnamenevis.org/showthread.php?529807-بدست-آوردن-ID-متناظر-با-آیتم-انتخابی-از-ComboBox)" از datatable استفاده کنید و اونو به دیتاسورس کمبوباکس بدید. باید displaymember و valuemember را هم ست کنید.

در این صورت آیا جستجوی نام و نام خانوادگی در کمبوباکس طبق مثال زیر که همه کلماتی که شامل حرف مورد جستجو باشد را بیاورد.
مثال
مثلا کلمه ی "گل" در کمبوباکس وارد شده و قراره به طور مثال 5 داده اولی که داخلشون گل پیدا شد را به صورت لیستی در کمبوباکس نمایش بدیم
به فرض این که در لیست داده هایمون 10 تا داده داریم که توش کلمه ی گل هست به طور مثال این 5 تا نمایش داده میشه
ارامش گل زیبا
خواب گل
گل ابی
گلگیر ماشین
گل نیلوفر

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

SqlConnection con = new SqlConnection();
con.ConnectionString = KB.connection_string;
Operation.open(con);

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select id_madreseh,txt_madreseh from madreseh where statusm=1";
cmd.Connection = con;

System.Data.DataTable dt = new System.Data.DataTable();

SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

cbo_namemadreseh.DataSource = dt;
cbo_namemadreseh.DisplayMember = "txt_madreseh";
cbo_namemadreseh.ValueMember = "id_madreseh";
cbo_namemadreseh.Text = "نام آموزشگاه";
Operation.close(con);


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

Mahmoud.Afrad
دوشنبه 11 دی 1396, 21:29 عصر
دو تا راه دارید. یکی اینکه با تغییر متن وارد شده توسط کاربر، یک کوئری (با استفاده از Like) بزنید و اطلاعات رو دریافت و در کنترل مورد نظر نمایش بدید.
اگر اطلاعات جدول زیاد نیست و در آینده هم تعداد زیاد نخواهد بود، میتونید همه رو در دیتاتیبل لود کنید و اونو فیلتر کنید.

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

m_karimi
پنج شنبه 14 دی 1396, 23:55 عصر
دو تا راه دارید. یکی اینکه با تغییر متن وارد شده توسط کاربر، یک کوئری (با استفاده از Like) بزنید و اطلاعات رو دریافت و در کنترل مورد نظر نمایش بدید.
اگر اطلاعات جدول زیاد نیست و در آینده هم تعداد زیاد نخواهد بود، میتونید همه رو در دیتاتیبل لود کنید و اونو فیلتر کنید.

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

با سلام
من کد زیر را در رویداد textupdate نوشتم ولی مشکلش اینجاست که وقتی یک حرف در کمبوباکس تایپ میکنم تمام مدرسه هایی که آن حرف در آن هست را میاورد. و اولین آن را در کمبوباکس به حالت انتخاب شده ظاهر میکند. من میخواهم بتوانم یک کلمه در کمبوباکس تایپ کنم و مدارسی که شامل آن کلمه هست را بیاورد ولی اولین حرف را که تایپ می کنم همه مدارس شامل ان حرف را میاورد.
در واقع مثل سرچ خود کمبو باکس میخواهم با این تفاوت که همه کلماتی که شامل آن کلمه سرچ شده است بیاورد.
SqlConnection connn = new SqlConnection();
connn.ConnectionString = KB.connection_string;
Operation.open(connn);
DataSet ds = new DataSet();
SqlDataAdapter objDataAdapter = new SqlDataAdapter("Select * From madreseh", connn);
objDataAdapter.Fill(ds, "madreseh");

DataTable dt = new DataTable();
dt = ds.Tables["madreseh"];
dt.DefaultView.RowFilter = "txt_madreseh like'%" + cbo_namemadreseh.Text.Trim() + "%'";
if (dt.DefaultView.Count == 0)
MessageBox.Show("!" + "کلمه ی مورد نظر پیدا نشد ");
cbo_namemadreseh.DataSource = dt;
cbo_namemadreseh.DisplayMember = "txt_madreseh";
cbo_namemadreseh.ValueMember = "id_madreseh";
cbo_namemadreseh.DroppedDown = true;

اگر ممکن است یک نمونه بگذارید خیلی سرچ کردم ولی نمیدانم چه کار کنم