PDA

View Full Version : سوال: گرفتن تاریخ از کاربر با استفاده از کلاس persiancalender در C#‎‎



mahan0o0
جمعه 29 اسفند 1393, 12:16 عصر
سلام دوستان
می خواستم بدونم چطور میشه تاریخ تولد کاربر رو با استفاده از Persian calendar در windows application گرفت و اونو توی دیتابیس ذخیره کرد.من تاریخ جاری سیستم به میلادی رو به شمسی تبدیل میکنم ولی نمیدونم چطور باید از کاربر تاریخ رو بگیره و تبدیل کنه و توی دیتابیس که حتما باید از نوع datetime باشه ذخیره کنه. فقط هم همین روشو می خوام. کامپوننت شمسی و یا روش دیگه ای رو نمیخوام.
ممنون میشم راهنمایی کنید

plus
جمعه 29 اسفند 1393, 13:31 عصر
PersianCalendar که کنترل UI نیست که شما با اون میخواین تاریخ رو از کاربر بگیرین!! سوالتون یکم گنگ هست ولی در هر صورت برای کاری که میخواین روند به این صورت هست:
1) دریافت تاریخ از کاربر توسط یک کامپوننت دریافت تاریخ.
2) اگه کامپوننت مورد نظر تاریخ رو به صورت میلادی ارائه نمیده، تبدیل تاریخ دریافت شده از طریق کنترل به تاریخ میلادی.
3) ذخیره تاریخ میلادی در دیتابیس.

اگه منظورتون قسمت دوم مرحله دو هست، احتمالا کنترل مورد نظر تاریخ رو به صورت رشته شمسی (مثلا 90/10/10) به شما میده. در این حالت اول باید بسته به فرمتی که کنترل مورد نظر بهتون تاریخ میده باید اول مولفه های تاریخ (سال، روز و ماه) رو به صورت عددی بدست بیارین و بعد با کلاس PersianCalendar به یک شی DateTime با تاریخ میلادی تبدیل کنید:

PersianCalendar persianCalendar = new PersianCalendar();
DateTime dateTime = persianCalendar.ToDateTime(1390, 10, 10, 0, 0, 0, 0);

البته یک کنترل خوب باید خروجی DateTime داشته باشه که شما نیاز به تبدیل نداشته باشی.

mahan0o0
جمعه 29 اسفند 1393, 15:26 عصر
شاید من منظورم رو بد رسوندم. من یک فرم ثبت اطلاعات پرسنل دارم که توی اون تاریخ تولد را از کاربر باید بگیرد. من میخوام از طریق یک maskedtextbox کاربر بتونه تاریخ تولد رو به شمسی وارد کنه و اگه اشتباه وارد کرد مثلا ماه رو هم بیشتر از 31 روز زد خطا بده.میخوام حتما این کار رو با persiancalender خود c# انجام بدم. ممنون میشم راهنمایی کنید.

plus
جمعه 29 اسفند 1393, 16:43 عصر
در این صورت، همونطور که گفتم شما باید بعد از دریافت Text از کنترل MaskedTextBox، با متدهای کلاس String و یا استفاده از کلاس RegEx، مولفه‌های سال، روز و ماه رو استخراج کنید، با int.Parse یا int.TryParse‌ به عدد تبدیل کنید و به متد ToDateTime کلاس Persian Calendar‌بدین. در صورتی که تاریخ معتبر نباشه، این متد ArgumnetOutOfRangeException میده.
برای مثال در صورتی که در MaskedTextBox از 0000/00/00 استفاده کرده باشید:

private void button1_Click(object sender, EventArgs e) {
Regex regEx = new Regex(@"\s*(\d{1,4})\s*/\s*(\d{1,2})\s*/\s*(\d{1,2})\s*");
Match match = regEx.Match(maskedTextBox1.Text);
if (match.Success) {
int year = int.Parse(match.Groups[1].Value);
int month = int.Parse(match.Groups[2].Value);
int day = int.Parse(match.Groups[3].Value);
PersianCalendar persianCalendar = new PersianCalendar();
try {
DateTime dateTime = persianCalendar.ToDateTime(year, month, day, 0, 0, 0, 0);
MessageBox.Show(string.Format("Entered date: {0}", dateTime));
}
catch (ArgumentOutOfRangeException) {
MessageBox.Show("Invalid persian date.");
}
}
else {
MessageBox.Show("Invalid persian date.");
}
}