PDA

View Full Version : سوال: عدم اجازه به کاربر در تایپ غیر مجاز در ComboBox



shahab2025
چهارشنبه 29 آذر 1391, 10:45 صبح
با سلام
من یک ComboBox دارم که با توجه به آیتمهای زیاد آن که از یک دیتاست دریافت میشود، خاصیتهای آن به شرح زیر است :


cmbInvCard.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
cmbInvCard.AutoCompleteSource = AutoCompleteSource.ListItems;

مشکل من اینجاست که میخوام کاربر نتونه کاراکتری غیر از آنهایی که به عنوان آیتم وجود دارند تایپ کنه
یعنی اگر فقط آیتمهای 2002و2003 موجود هست نتواند 2004 را تایپ کنه
قابل به ذکر است که من نمی تونم امکان تایپ را از کاربر بگیرم فقط باید محدود بشه
میدونم که در Key_Press باید بنویسم ولی نمی دونم چگونه بنویسم
مرسی

vistacali
چهارشنبه 29 آذر 1391, 12:10 عصر
من که اصلان سوال رو نفهمیدم میشه توضیح واضع تر بدی میخوای چکار کنی

shahab2025
چهارشنبه 29 آذر 1391, 12:30 عصر
من که اصلان سوال رو نفهمیدم میشه توضیح واضع تر بدی میخوای چکار کنی

یک جدول دارم که 1000 تا آیتم داره - توسط دیتاست به یک ComboBox بایند شده - کاربر باید بتونه توسط تایپ اطلاعات را فیلتر کنه و در نهایت انتخاب کنه - اما نباید گزینه هایی خارج از اونها انتخاب کنه - پس من باید چک کنم که وقتی کاراکتری تایپ کرد آیا با اطلاعات درون آیتمها همخوانی داره یا نه اگر نداره نباید اجازه بدم اون کاراکتر تایپ بشه

حالا با چه کدی این کار را انجام بدم ؟؟؟ نمی دونم .

mousa1992
چهارشنبه 29 آذر 1391, 13:06 عصر
چیکارش داری بنده خدا بذار تایپ کنه خب :D
شما فقط با مدریریت استثنا ها کنتر میکنی که برنامه مشکلی براش پیش نیاد
برا اون چیزی هم که میخواین میتونین توی رویداد keypress چک کنه که اگه چنین چیزی موجود نبود خاصیت text کامبو رو string.empty قرار بده
سوالی بود دوستان هستن :D
موفق باشی

AmirGhasemi
چهارشنبه 29 آذر 1391, 14:46 عصر
توي پرپراتي اش تنظيم داره كه فقط از ليست بايند شده بخونه
اين همه روضه نداشت

shahab2025
چهارشنبه 29 آذر 1391, 16:55 عصر
توي پرپراتي اش تنظيم داره كه فقط از ليست بايند شده بخونه
اين همه روضه نداشت

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

Ghaem66
چهارشنبه 29 آذر 1391, 17:05 عصر
یه کامپوننت هست به نام multicolumncombobox که میتونی تو تنظیماتش این کار رو بکنی. یه سرچ کن پیداش میکنی

Ghaem66
چهارشنبه 29 آذر 1391, 17:10 عصر
همین کامپوننت

shahab2025
چهارشنبه 29 آذر 1391, 17:19 عصر
همین کامپوننت

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

Ghaem66
چهارشنبه 29 آذر 1391, 17:30 عصر
خب دوست عزیز شما باید با کدنویسی اون کامپوننت رو اضافه کنید. حالا من اضافه شده به فرم رو براتون میذارم. تنها کاری که باید بکنین اینه که اون فایل exe رو به رفرنسهاتون اضافه کنید و کامپوننت رو از این پروژه به پروژه خودتون کپی کنید. مشکلی بود در خدمتم

مهرداد صفا
چهارشنبه 29 آذر 1391, 19:42 عصر
یک جدول دارم که 1000 تا آیتم داره - توسط دیتاست به یک ComboBox بایند شده - کاربر باید بتونه توسط تایپ اطلاعات را فیلتر کنه و در نهایت انتخاب کنه - اما نباید گزینه هایی خارج از اونها انتخاب کنه - پس من باید چک کنم که وقتی کاراکتری تایپ کرد آیا با اطلاعات درون آیتمها همخوانی داره یا نه اگر نداره نباید اجازه بدم اون کاراکتر تایپ بشه

حالا با چه کدی این کار را انجام بدم ؟؟؟ نمی دونم .


سلام
شما میتوانید autocomplete را دستی و طبق میل خودتان طراحی کنید.
یک Textbox و یک Combobox و یک Timer به فرم اضافه کنید.
در رویداد KeyPress مربوط به Combo آرگومنتها را به رویداد KeyPress مربوط به TextBox ارسال کنید.
در Textbox_KeyPress ابتدا تایمر را غیر فعال کنید و سپس TextBox1.Text را در آیتمهای Combo جستجو کنید، در صورت پیدا شدن آن را انتخاب کنید و در غیر این صورت کاراکتر تایپ شده را به Textbox1.Text اضافه نکنید. در آخر هم Timer را فعال کنید.

در تایمر فقط نوشته های درون Textbox1 را خالی کنید. به این صورت:

//in the name of god
//صل الله علی محمد و آله

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange((from file in new DirectoryInfo(@"c:\windows\system32").GetFiles("*") select file.Name).ToArray<object>());
timer1.Interval = 2000;
}

private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
textBox1_KeyPress(textBox1, e);
e.Handled=true;
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
timer1.Stop();
var MatchItems =from item in comboBox1.Items.Cast<string>() where item.ToUpper().StartsWith((sender as Control).Text.ToUpper() + char.ToUpper(e.KeyChar)) select item;
if (MatchItems.Count()<1)
{
e.Handled = true;
System.Media.SystemSounds.Beep.Play();
}
else
{
comboBox1.SelectedItem=MatchItems.First();

(sender as TextBox).Text += e.KeyChar;
}
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = "";
timer1.Stop();
}
}
}