برای کنترل ورودی تکس باکس ها می خوام از عبارت های با قاعده یا Regular Expressions استفاده کنم جمعا چند روزی سرچ و تست و ... انجام دادم ولی به چیزی که میخوام نرسیدم
موارد مورد نیاز:
1.فقط عدد وارد شود تا چهار رقم صحیح و چهار رقم اعشار بازه (0.0001 تا 9999.9999)
2.با کپی و پیست عدد وارد نشه به تکس باکس
private void Txt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex(@"[^\d*\.?\d{0,4}]");
e.Handled = regex.IsMatch(e.Text);
}
با کد بالا فقط عدد وارد میشه تعداد رقم اعشار و صحیح نمیشه کنترل کرد الان باید با این .?\d{0,4} بعد اعشار تا 4 رقم رو قبول کن ولی کار نمیکنه این در حالی که تو سایت https://regexr.com/ درست کار میکنه
و اینکه چطوری جلوی وارد شدن با پیست کردن رو بگیرم چون تو همین حالت هم وقتی حروف رو کپی کرده باشی توش پیست میشه
سلام دوست گرامی. ابتدا برای لغو حالت Paste در یک تکست باکس به روش زیر عمل کنید.
در ابتدا کد زیر را در بدنه فرم خود ایجاد کنید.
private void Foo(object sender, ExecutedRoutedEventArgs e)
{
e.Handled = true;
}
سپس در رویداد لود فرم خود یعنی Form_Loaded خود کد زیر را قرار دهید.
Txt.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Foo));
خب تا اینجا حالت Paste تکست باکس غیر فعال شد و دیگه هیچ کس نمیتونه مقداری رو پیست کنه. چه با حالت راست کلیک و چه با حالت Ctr+V
اما در مورد سوال اولتون که فرمت خاصی از اعداد اعشاری رو میخواهید وارد تکست باکس کنید رو میتونید به روش زیر عمل کنید.
ابتدا در رویداد PreviewTextInput کد زیر رو قرار بدید.
private void Txt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Regex reg = new Regex("[^0-9/.]+");
e.Handled = reg.IsMatch(e.Text);
}
سپس در رویداد LostFocus تکست باکس خود کد زیر رو قرار بدید.
private void Txt_LostFocus(object sender, RoutedEventArgs e)
{
string text = Txt.Text.Trim();
if (text.Length != 9) { MessageBox.Show("فرمت وارد شده باید تا چهار رقم صحیح و چهار رقم اعشار باشد"); e.Handled = true; Txt.Clear(); return; }
if (text.Substring(4, 1) != ".") { MessageBox.Show("فرمت وارد شده صحیح نیست"); e.Handled = true; Txt.Clear(); return; }
int range = 0;
if (!int.TryParse(text.Substring(0, 4), out range)) { MessageBox.Show("فرمت وارد شده صحیح نیست"); e.Handled = true; Txt.Clear(); return; }
if (!int.TryParse(text.Substring(5, 4), out range)) { MessageBox.Show("فرمت وارد شده صحیح نیست"); e.Handled = true; Txt.Clear(); return; }
}
این کدها دقیقا همون طور که شما گفتید باعث میشه کاربر نتونه خارج از فرمتی که گفتید چیزی رو وارد کنه. یعنی در صورت وارد کردن فرمت اشتباه یعنی فرمت خارج از (0000.0000) به کاربر پیغام میده و تکست باکس رو هم خالی میکنه.
کدهای بالا رو اجرا کنید و در صورتی که بازم مشکل داشتید بگید تا کدها رو اصلاح کنم.
موفق باشید.
مرسی Sowgandi
ببینید تو سوال هم گفتم عدد بین 0.0001 تا 9999.9999 همه عداد بین اینها ممکنه تک رقمی صحیح باشه یا تک رقمی دوعشار
درمورد پیست کردن نمیخوام کل فرم این محدودیت رو بزارم فقط توو تکس باکس مد نظر
در مورد کد Regex هم کد شما هم کدهایی که خودم زدم میشه چندتا . هم میشه زد مثل 90.09.9.10
و درمورد رویداد LostFocus تکست باکس هم میخوام اگه بشه با همون Regex کنترل کنم خوب میشه بخاطر بحث کاربری راحت
این زبان Regex داستان داره چندتا سایت خوب هم پیدا کردم که کامل توضیح دادن ولی نتونستم چیزی رو که مد نظرم برسم بهش
سلام مجدد.
vahdat عزیز در مورد پیست کردن اگه دقت کنید کدی که دادم فقط تکست باکس مورد نظر رو محدود میکنه و به سایر تکست باکس ها کاری نداره. در کدی که در لود فرم مینویسید Txt همون نام تکست باکسی هست که میخواهید محدود کنید.
در مورد Regex که فرمودید خب باید جست و جو کنید ببینید اصلا چنین کد Regex وجود داره یا خیر اگه هم باشه به این شکل که شما میخواهید درست کار کنه یا خیر. در این مورد باید خیلی تحقیق و جست و جو کنید ببینید میشه همچین کد Regex ساخت یا خیر. ولی معمولا در این طور مواقع که ورودی تکست باکس رو زیادی میخواهید سفارشی کنید باید از همین روش هایی که گفتم استفاده کنید. البته این نظر من هست و روشهای دیگه ای هم وجود داره. مثلا کامپوننت های تکست باکس مخصوص عدد و مقادیر عددی وجود داره که اون رو هم میتونید تو اینترنت در موردش سرچ کنید.
اما با توجه به خواسته شما من یک کدی ساختم که درست همانند Regex عمل میکنه و کاربر نمیتونه مقادیر غیر از اون چیزی که فرمودید رو وارد کنه. در کد زیر همون مواردی رو که گفتید من آوردم این کد ها رو در رویداد TextChanged تکست باکس قرار بدید.
فقط توجه داشته باشید که این کدها رو همین العان خودم ساختم و هنوز زیاد تست نکردم. لطفا در صورت استفاده مرتب تست کنید واگر باگی داشت بفرمایید تا برطرف کنم. البته خودتون هم میتونید با بررسی کدها از نحوه عملکرد اون مطلع شوید.
private void Txt_TextChanged(object sender, TextChangedEventArgs e)
{
string text = Txt.Text.Trim();
if(text == "") { return; }
double d = 0.0;
if(!double.TryParse(text , out d))
{
if(text.Length == 1 && text == ".") { return; }
Txt.Text = text.Remove(text.Length - 1, 1);
Txt.SelectionStart = text.Length;
return;
}
double D = Convert.ToDouble(text);
if ((D < 0.0001 && text.Length == 5) || D > 9999.9999 || text.Length > 9 || (text.Substring(0,1) == "." && text.Length > 5))
{
Txt.Text = text.Remove(text.Length - 1, 1);
Txt.SelectionStart = text.Length;
return;
}
}
استفاده کنید و اگر مشکلی بود در خدمتم.
Sowgandi عزیز یه دنیا تشکر
دقیقا همون چیزی هستش که میخواستم
خیلی گشتم ولی نتونستم پیدا کنم
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
318
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4282
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3875
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
660
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3172
- پاسخ :
2
|
تاریخ :
1403/04/12
- ساعت :
07:27:00 PM
- بازدید :
658
- پاسخ :
0
|
تاریخ :
1398/09/14
- ساعت :
09:43:00 PM
- بازدید :
3316
- پاسخ :
2
|
تاریخ :
1398/09/17
- ساعت :
12:33:00 AM
- بازدید :
5857
- پاسخ :
2
|
تاریخ :
1402/04/18
- ساعت :
02:50:00 PM
- بازدید :
1230
- پاسخ :
1
|
تاریخ :
1402/01/19
- ساعت :
12:30:00 PM
- بازدید :
1560
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2006
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
74
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
108
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1033
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
428
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4797
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1160
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
597
- پاسخ :
1
|