دسته بندی ها
14:24 1399/09/20

محدود کردن ورود مقادیر در TextBox سی شارپ

مشخصات سوال کننده :
کاربر : mojtabahakimian     امتیاز کاربر : 155     رتبه کاربر : 10
دسته بندی : WPF سی شارپ

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3990
2 نظر
mojtabahakimian : متاسفانه هیچکدوم از روش هایی که میشه توی ویندوز فرم استفاده کرد توی WPF کار نمیکنه

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 02:26 1399/09/20
mojtabahakimian : فقط یک نکته رو در نظر داشته باشید این Regex جلوی Copy/Paste رو نمیگیره

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 02:50 1399/09/20
هوش مصنوعی

پاسخ هوش مصنوعی

برای محدود کردن ورودی تکست باکس در WPF و جلوگیری از کرش کردن نرم افزار هنگام چسباندن (Paste) محتوا از کلیپ بورد، می توانید از رویداد `PreviewTextInput` و همچنین رویداد `Paste` استفاده کنید. در زیر مثالی از یک تکست باکس که فقط اجازه ی ورود اعداد را می دهد، آورده شده است:

using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace YourNamespace
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MyTextbox_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            e.Handled = !IsTextAllowed(e.Text);
        }

        private void MyTextbox_Paste(object sender, DataObjectPastingEventArgs e)
        {
            if (e.DataObject.GetDataPresent(DataFormats.Text))
            {
                string pasteData = (string)e.DataObject.GetData(DataFormats.Text);
                if (!IsTextAllowed(pasteData))
                {
                    e.CancelCommand(); // Prevent paste if data is not allowed
                }
            }
            else
            {
                e.CancelCommand(); // Prevent paste if data format is not text
            }
        }

        private bool IsTextAllowed(string text)
        {
            Regex regex = new Regex("^[0-9]*$"); // Only allow digits
            return regex.IsMatch(text);
        }
    }
}

و برای ارتباط این کد با XAML:

<TextBox Name="MyTextbox" 
         PreviewTextInput="MyTextbox_PreviewTextInput" 
         DataObject.Pasting="MyTextbox_Paste" />

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

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : Alireza 20:52 1399/09/21

سلام 

اول از همه این کد رو توی PreviewTextInput تکست باکستون بنویسید:

private void MyTextbox2_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            //عبارت باقاعده
            Regex regex = new Regex("[^0-9]");
            e.Handled = regex.IsMatch(e.Text);
        }

در مرحله بعد قبل از Window_Loaded این کد رو بنویس:

private void Foo(object sender, ExecutedRoutedEventArgs e)
        {
            e.Handled = true;
        }

در آخر هم توی Window_Loaded این کد رو بنویس:

MyTextbox2.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Foo));

این کار باعث پیست نشدن در تکست باکس میشه.

 

این کد رو هم در PreviewKeyDown تکست باکستون بنویسید تا از دکمه Space جلوگیری کنه که به مشکل برنخوری:

private void MyTextbox2_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Space)
                e.Handled = true;
        }

تمام.

(بکوبین لایکو)

ویرایش شده در جمعه 21 آذر 1399 ساعت 20:57:20
به این پاسخ امتیاز بدهید    2
امتیاز: 115 رتبه: 13
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود