27-06-2014، 12:29 PM
یکی از مشکلات بسیار مهم در ورود اطلاعات در بیشتر برنامه های طراحی شده ، خطای انسانیِ چند بار وارد کردن اطلاعات هست. یکی از راه حل های جلوگیری از این کار، چک کردن مشخصه وارد شده توسط کاربر است. اما در این روش کاربر پس از وارد کردن کامل اطلاعات از وجود این مشخصه مطلع می شود. این روش وقت کاربر را هدر داده و باعث تقابل بیشتر کاربر با برنامه می شود.
اما روش بهتری برای جلوگیری از این کار وجود دارد. در دات نت وقتی از کنترل ComboBox استفاده می کنیم، اگر خصیصه DropDownStyle بر روی DropDown تنظیم شده باشد، با وارد کردن هر کاراکتر در ComboBox لیست تمام آیتم هایی که با آن کاراکتر شروع می شوند به عنوان پیشنهاد نشان داده می شود. اما در مورد کنترل تکست باکس برای این کار ۲ روش وجود دارد. یک روش استفاده از AutoComplete هست (که برخی از کامپوننت ها از این خصیصه پشتیبانی نمی کنند) و دیگری ساخت دستی این روش برای تکست باکس و هر کنترل دیگری است.
در این روش من از دیتابیس نمونه Northwind و SQLServer و LINQ To SQL استفاده کردم.
برای ساخت پیشنهاد دهنده کلمات در سی شارپ اول یک کنترل تکست باکس بر روی فرم بگذارید. سپس نام آن را به txtName تغییر دهید. با استفاده از کد های زیر اول یک نمونه از دیتابیس و یک ListBox می سازیم :
در مرحله بعد در هنگام ساخت فرم و بعد از تابع InitializeComponent کد های زیر را وارد می کنیم:
در خط دوم برای ایجاد تابع دبل کلیک کنترل Listbox فرم یک EventHandler ایجاد کردیم.
در تابع TextChanged کنترل تکست باکس کد زیر را وارد می کنیم:
برای ساخت تابع GetSuggestions به صورت زیر عمل می کنیم:
در واقع این تابع با استفاده از LINQ به دیتابیس و جدول Customers وصل شده و در ستون ContactName گشته و نام افرادی که با پارامتر رشته ای part شروع شوند رو بر می گردونه.
در آخر هم برای اینکه وقتی کاربر بر روی یک نام در ListBox کلیک کرد، نام کامل در تکست باکس نمایش داده شود از کد زیر استفاده می کنیم:
اما روش بهتری برای جلوگیری از این کار وجود دارد. در دات نت وقتی از کنترل ComboBox استفاده می کنیم، اگر خصیصه DropDownStyle بر روی DropDown تنظیم شده باشد، با وارد کردن هر کاراکتر در ComboBox لیست تمام آیتم هایی که با آن کاراکتر شروع می شوند به عنوان پیشنهاد نشان داده می شود. اما در مورد کنترل تکست باکس برای این کار ۲ روش وجود دارد. یک روش استفاده از AutoComplete هست (که برخی از کامپوننت ها از این خصیصه پشتیبانی نمی کنند) و دیگری ساخت دستی این روش برای تکست باکس و هر کنترل دیگری است.
در این روش من از دیتابیس نمونه Northwind و SQLServer و LINQ To SQL استفاده کردم.
برای ساخت پیشنهاد دهنده کلمات در سی شارپ اول یک کنترل تکست باکس بر روی فرم بگذارید. سپس نام آن را به txtName تغییر دهید. با استفاده از کد های زیر اول یک نمونه از دیتابیس و یک ListBox می سازیم :
کد:
Control focused;
static string conn = Suggest.Properties.Settings.Default.NorthwindConnectionString;
DataClasses1DataContext myContext;
ListBox myList;
کد:
myList = new ListBox();
myList.DoubleClick += new EventHandler(myList_DoubleClick);
myContext = new DataClasses1DataContext(conn);
در تابع TextChanged کنترل تکست باکس کد زیر را وارد می کنیم:
کد:
private void txtName_TextChanged(object sender, EventArgs e)
{
Control c = sender as Control;
focused = c;
myList.Size = new System.Drawing.Size(100, 200);
myList.Location = new Point(c.Left, c.Top + c.Height);
this.Controls.Add(myList);
myList.BringToFront();
myList.Items.Clear();
myList.Items.AddRange(GetSuggestions(c.Text));
if (myList.Items.Count > 0)
myList.Visible = true;
else
myList.Visible = false;
}
کد:
private String[] GetSuggestions(string part)
{
DataClasses1DataContext myContext = new DataClasses1DataContext(conn);
return myContext.Customers.Where(n => n.ContactName.StartsWith(part))
.OrderBy(n => n.ContactName)
.Select(n => n.ContactName).ToArray();
}
در آخر هم برای اینکه وقتی کاربر بر روی یک نام در ListBox کلیک کرد، نام کامل در تکست باکس نمایش داده شود از کد زیر استفاده می کنیم:
کد:
void myList_DoubleClick(object sender, EventArgs e)
{
if (myList.SelectedIndex > 0)
{
focused.Text = myList.SelectedItem.ToString();
myList.Hide();
}
}
*شما قادر به دیدن لینک ها نیستید ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید*
خورشید باش که اگر خواستی بر کسی نتابی نتوانی.