نحوه برگشت فوکوس روی تکست باکس در صورت ورود غیر مجاز
توی سی شارپ WPF یک تکست باکس داریم که توی اون تاریخ رو وارد میکنند
میخوایم در رویداد Lost Focus زمانی که از روی تکست باکس خارج شد , بررسی کنه اگر مقدار ورودی تاریخ اشتباه بود پیغام خطا بده و برگرده روی تسکت باکس تاریخ تا مجددا تاریخ صحیح رو وارد کنه و این کار تا زمانی که تاریخ درست رو وارد کنه ادامه داشته باشه
مشکل چیه ؟ :
وقتی داخل رویداد Lost Focus میگیم بعد از بررسی در صورت وجود خطا برگرد توی تکست باکس چون باهم تداخل داره توی یک حلقه گیر میفته و دایم پیغام خطا میده و بیرون نمیره !
Code Behind :
بررسی صحت تاریخ ورودی :
public static bool IsValidedDate(string tempDate)
{
if (!tempDate.Contains("/"))
{
//14000203
string sal = tempDate.Substring(0, 4);
string mah = tempDate.Substring(4, 2);
string rooz = tempDate.Substring(6, 2);
tempDate = $"{sal}/{mah}/{rooz}";
}
DateTime temp;
if (DateTime.TryParse(tempDate, out temp))
{
return true;
// Yay :)
}
else
{
return false;
// Aww.. :(
}
}
رویداد روی تکست باکس تاریخ :
private void DATE_N_LostFocus(object sender, RoutedEventArgs e)
{
if (!IsValidedDate(DATE_N.Text))
{
MessageBox.Show("مقدار تاریخ صحیح نیست", "", MessageBoxButton.OK, MessageBoxImage.Error);
DATE_N.Focus();
return;
}
}
لطفا راهنمایی بفرمایید باتشکر
پاسخ هوش مصنوعی
برای حل این مشکل و جلوگیری از بروز حلقه بی پایان، می توانید از یک پرچم (flag) استفاده کنید که نشان دهد آیا کاربر هنوز در حال وارد کردن مقدار مناسب است یا خیر. همچنین می توانید از رویداد `PreviewLostKeyboardFocus` بجای `LostFocus` استفاده کنید تا بررسی تاریخ قبل از تغییر فوکوس انجام شود. به این صورت، هنگامی که کاربر بر روی دیگر کنترل ها کلیک می کند، بررسی صحت تاریخ قبل از به دست آوردن فوکوس روی کنترل جدید انجام می شود.
در زیر کد اصلاح شده آورده شده است:
private bool isValidating = false;
private void DATE_N_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
if (!isValidating)
{
isValidating = true; // فعال کردن پرچم
if (!IsValidedDate(DATE_N.Text))
{
MessageBox.Show("مقدار تاریخ صحیح نیست", "", MessageBoxButton.OK, MessageBoxImage.Error);
DATE_N.Focus(); // برگرداندن فوکوس به تکست باکس
e.Handled = true; // جلوگیری از تغییر فوکوس
}
isValidating = false; // غیر فعال کردن پرچم
}
}
با این تغییر، اگر کاربر مقدار نادرستی وارد کند، با پیغام خطا مواجه شده و فوکوس به تکست باکس باز می گردد، بدون ایجاد حلقه بی پایان.
دوستان این راه حل دوتا مشکل هست : یکی مشکل برگشت فوکوس روی کنترل در ورود مقدار غیر مجاز , مشکل فوکوس نکردن روی کنترل
private void text1_LostFocus(object sender, RoutedEventArgs e)
{
if (text1.Text != "1")
{
MessageBox.Show("Please Enter Valid Number !");
var restoreFocus = (System.Threading.ThreadStart)delegate { text1.Focus(); text1.SelectAll(); };
Dispatcher.BeginInvoke(restoreFocus);
}
}
من با این مشکلم حل شد.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول