PDA

View Full Version : مشکل در maskedtextbox



nadia_1987
یک شنبه 27 تیر 1389, 03:54 صبح
سلام
ممنون میشم راهنمایی کنید .

یک فرم دارم که شامل maskedtextbox میشه و حالا مثلا اگه mask برای زمان بذارم. کاربر میتونه هر عددی وارد کنه مثل 32/34/9938 . فرمت درسته اما از نظر معنا نه . چطور می تونم همچین اشتباه هایی را چک کنم و به کاربر اطلاع بدم؟

homan1374
یک شنبه 27 تیر 1389, 09:00 صبح
میتونی از عبارات با قاعده(Regx) استفاده کنی

میلاد قاضی پور
یک شنبه 27 تیر 1389, 11:53 صبح
ببینید مثلا من برای کنترل صحت تاریخ تولد وارد شده از این الگو استفاده میکنم که البته کاملا درست نیست ولی به درد شما میخوره :



//الگویی جهت بررسی تاریخ تولد وارد شده توسط کاربر
Regex rgx = new Regex("13[0-9][0-9]/[0-1][0-9]/[0-9][0-9]");
string tt = textBoxM1_tavalod.Text;


//بررسی صحت تاریخ تولد
if (!rgx.IsMatch(tt))
MessageBox.Show("لطفا تاریخ تولد را بدرستی وارد کنید", "",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);


نیم اسپیس سیستم دات تکست دات ریگلار اکسپرژن رو ادکنید .

NIK
یک شنبه 27 تیر 1389, 12:15 عصر
ببینید مثلا من برای کنترل صحت تاریخ تولد وارد شده از این الگو استفاده میکنم که البته کاملا درست نیست ولی به درد شما میخوره :



//الگویی جهت بررسی تاریخ تولد وارد شده توسط کاربر
Regex rgx = new Regex("13[0-9][0-9]/[0-1][0-9]/[0-9][0-9]");
string tt = textBoxM1_tavalod.Text;


//بررسی صحت تاریخ تولد
if (!rgx.IsMatch(tt))
MessageBox.Show("لطفا تاریخ تولد را بدرستی وارد کنید", "",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);

نیم اسپیس سیستم دات تکست دات ریگلار اکسپرژن رو ادکنید .




اینطوری روز بیشتر از 31 و ماه بیشتر از 12 هم میگیره. به نظر من بهتره که روز و ماه و سال رو SubString کنه و بعد چک کنه.

موفق باشید.

nadia_1987
یک شنبه 27 تیر 1389, 14:23 عصر
اینطوری روز بیشتر از 31 و ماه بیشتر از 12 هم میگیره. به نظر من بهتره که روز و ماه و سال رو SubString کنه و بعد چک کنه.

موفق باشید.


ممنون از راهنماییتون . اما منظورتون رو درست متوجه نشدم . یعنی اگه کاربر تاریخ 3/12/1987 رو وارد کرد با substring اونها رو جدا کنم بعد روز = 3
ماه = 12
سال = 1987
بشه و بعد جدا واسه هر کدوم regexpr رو اعمال کنیم . اینجوری که دوباره باید اعداد روز رو تفکیک کنم ، درسته ؟

NIK
یک شنبه 27 تیر 1389, 14:42 عصر
ممنون از راهنماییتون . اما منظورتون رو درست متوجه نشدم . یعنی اگه کاربر تاریخ 3/12/1987 رو وارد کرد با substring اونها رو جدا کنم بعد روز = 3
ماه = 12
سال = 1987
بشه و بعد جدا واسه هر کدوم regexpr رو اعمال کنیم . اینجوری که دوباره باید اعداد روز رو تفکیک کنم ، درسته ؟

یک متد بنویسید که مقدار بازگشتی آن Bool بوده و تاریخ را به صورت String دریافت و روز و ماه و سال رو جدا کنه و چک کنه
روز از 31 بزرگتر یا از 1 کوچکتر نباشه
ماه از 12 بزرگتر و از 1 کوچکتر نباشه
سال هم بستگی به برنامتون داره.

اگر مورد قبول بود مقدار True و اگر نبود Fslse برگردونه.

هر جا نیاز به بررسی تاریخ داشتید، متد را صدا بزنید.

nadia_1987
یک شنبه 27 تیر 1389, 16:29 عصر
یک متد بنویسید که مقدار بازگشتی آن Bool بوده و تاریخ را به صورت String دریافت و روز و ماه و سال رو جدا کنه و چک کنه
روز از 31 بزرگتر یا از 1 کوچکتر نباشه
ماه از 12 بزرگتر و از 1 کوچکتر نباشه
سال هم بستگی به برنامتون داره.

اگر مورد قبول بود مقدار True و اگر نبود Fslse برگردونه.

هر جا نیاز به بررسی تاریخ داشتید، متد را صدا بزنید.

ممنون . ولی یه مشکل دیگه پیش می یاد . من از maskedtextbox استفاده کردم با این فرمت
----/--/--
و substring هم طبق همین فرمت نوشتم . اما اگه کاربر 3ویا 4 عدد وارد نکنه توی تابع substring تمام index و length قاطی می شه.


string st = maskedTextBox1.Text;
string day = st.Substring(0, 2);
string month = st.Substring(3, 2);
string year = st.Substring(6, 4);
int year1 = Convert.ToInt32(year);
int month1 = Convert.ToInt32(month);
int day1 = Convert.ToInt32(day);
if (day != "" && month != "" && year != "")
{
bool flag = check(year1, month1, day1);
if (flag == false)
{
label2.Text = "invalid date ";
}
}
else
{
label2.Text = "Null Input";
}

}

تابع check هم همونیه که گفتید نوشتم .

میلاد قاضی پور
یک شنبه 27 تیر 1389, 16:44 عصر
با رجکس هم میشه الگوی مناسب رو نوشت و نیاز به پیچیده کردن کد نیست . اما من وقتی برنامه خودمو مینوشتم فکر نکردم که تا اون حد ضرورت داشته باشه وقت گذاری برای پیدا کردن الگوی مناسب . ولی الان سعی میکنم الگوی درستی بنویسم و اگر زود تونستم تموم کنم همینجا قرار میدم .

nadia_1987
یک شنبه 27 تیر 1389, 17:16 عصر
با رجکس هم میشه الگوی مناسب رو نوشت و نیاز به پیچیده کردن کد نیست . اما من وقتی برنامه خودمو مینوشتم فکر نکردم که تا اون حد ضرورت داشته باشه وقت گذاری برای پیدا کردن الگوی مناسب . ولی الان سعی میکنم الگوی درستی بنویسم و اگر زود تونستم تموم کنم همینجا قرار میدم .


ممنون میشم . آخه این یه قسمت از برنامه ام هست که بعدا وارد دیتابیس میشه که اونجا type رو datetime گذاشتم . واسه همین نمی خوام به کاربر اجازه بدم هر چیزی رو وارد کنه .

میلاد قاضی پور
یک شنبه 27 تیر 1389, 18:13 عصر
13[0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])


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

nadia_1987
یک شنبه 27 تیر 1389, 19:20 عصر
13[0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])

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




خیلی خیلی ممنون . جای سال و روز رو عوض کردم . به جای 13 هم 19 زدم . مرسی مرسی .

NIK
شنبه 30 مرداد 1389, 13:37 عصر
من از این تابع استفاده میکنم و تا الان مشکلی نداشتم. برای یک maskedtextbox با فرمت 00/00/00 نوشته شده.

private bool checkDate(string date)
{
int day, year, month;

if (date.Length == 8)
{
if (date.Substring(0, 2).Trim() != String.Empty)
year = Convert.ToInt32(date.Substring(0, 2));
else
year = 0;

if (date.Substring(3, 2).Trim() != string.Empty)
month = Convert.ToInt32(date.Substring(3, 2));
else
month = 0;

if (date.Substring(6, 2).Trim() != string.Empty)
day = Convert.ToInt32(date.Substring(6, 2));
else
day = 0;

if ((year < 89) || (month > 12) || (month < 1) || (day < 1) || (day > 31))
{
return false;
}
return true;
}
else
return false;
}