دسته بندی ها
17:38 1398/10/18

اعتبار سنجی تکست باکس با استفاده از Regular Expression در WPF

مشخصات سوال کننده :
کاربر : vahdat     امتیاز کاربر : 289     رتبه کاربر : 5
دسته بندی : WPF

به این سوال امتیاز بدهید    5
تعداد بازدید این سوال : 4118
پاسخ دهنده : Sowgandi 18:59 1398/10/18

سلام دوست گرامی.  ابتدا برای لغو حالت 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) به کاربر پیغام میده و تکست باکس رو هم خالی میکنه.

 کدهای بالا رو اجرا کنید و در صورتی که بازم مشکل داشتید بگید تا کدها رو اصلاح کنم.

موفق باشید.

ویرایش شده در چهارشنبه 18 دی 1398 ساعت 19:05:52
به این پاسخ امتیاز بدهید    1
امتیاز: 871 رتبه: 3
پاسخ دهنده : vahdat 11:02 1398/10/19

مرسی Sowgandi

ببینید تو سوال هم گفتم عدد بین 0.0001 تا 9999.9999 همه عداد بین اینها ممکنه تک رقمی صحیح باشه یا تک رقمی دوعشار 

درمورد پیست کردن نمیخوام کل فرم این محدودیت رو بزارم فقط توو تکس باکس مد نظر

در مورد کد Regex هم کد شما هم کدهایی که خودم زدم میشه  چندتا . هم میشه زد     مثل 90.09.9.10 

و درمورد رویداد LostFocus تکست باکس هم میخوام اگه بشه با همون Regex کنترل کنم خوب میشه بخاطر بحث کاربری راحت 
 

 

این زبان Regex داستان داره چندتا سایت خوب هم پیدا کردم که کامل توضیح دادن ولی نتونستم چیزی رو که مد نظرم برسم بهش

لینک 1

لینک 2

ویرایش شده در پنج شنبه 19 دی 1398 ساعت 13:21:47
به این پاسخ امتیاز بدهید    3
امتیاز: 289 رتبه: 5
پاسخ دهنده : Sowgandi 13:01 1398/10/19

سلام مجدد. 

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;
            }
        }

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

به این پاسخ امتیاز بدهید    4
امتیاز: 871 رتبه: 3
پاسخ دهنده : vahdat 13:56 1398/10/19

Sowgandi عزیز یه دنیا تشکر  

دقیقا همون چیزی هستش که میخواستم 

خیلی گشتم ولی نتونستم پیدا کنم 

به این پاسخ امتیاز بدهید    4
امتیاز: 289 رتبه: 5
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود