PDA

View Full Version : سوال: چگونگی استفاده از تاریخ شمسی در asp.net



SuperStark
شنبه 05 شهریور 1390, 23:54 عصر
سلام دوستان
میخام از تاریخ شمسی در پروژم استفاده کنم اگه کمکم کنید ممنون میشم

dontspeak
شنبه 05 شهریور 1390, 23:59 عصر
به این آدرس (http://www.learningweb.ir/showthread.php?61-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D8%AA%D9%82%D9%88%DB%8C%D9%85-%D8%B4%D9%85%D8%B3%DB%8C) مراجعه کنید

Saman Hashemi
یک شنبه 06 شهریور 1390, 08:52 صبح
persia.net (http://www.persiadevelopers.com/articles/persia.aspx)

ramin149
یک شنبه 06 شهریور 1390, 10:07 صبح
http://hasheminezhad.com/datepicker

rahmatr
یک شنبه 06 شهریور 1390, 15:02 عصر
یک راه حل ساده برای استفاده از تاریخ شمسی در دات نت 3.5 به بالا (http://barnamenevis.org/showthread.php?69042-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C&p=1183629&viewfull=1#post1183629)

اینجوری هم استفاده میشه:
string shamsiToday = DateTime.Now.ToShamsi();

DateTime miladiDate = "1389/10/11".ToMiladi();

SKazemi
شنبه 09 فروردین 1393, 08:29 صبح
سلام به نظر من اینم یه راه حله خوبیه
http://www.codeproject.com/Articles/17495/Persian-DateTime

angel farahani
شنبه 09 فروردین 1393, 08:42 صبح
دوستان اگر بخواهیم در گرید ویو تاریخی که میلادی در پایگاه درج شده رو به شمسی نشون بدیم باید چه کنیم ؟

aminireza65
شنبه 09 فروردین 1393, 10:10 صبح
در رویداد databound از گرید ویو یه حلقه ایجاد میکنی که از صفر تا grid.rows.count-1 بشماره و سطر به سطر بررسی کنه.


System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar
DateTime d = new DateTime
d = tarikh miladi
p.GetDayOfMonth(d)
p.GetMonth(d)
p.GetYear(d)



با این کار روز و ماه و سال رو به شمسی جداگونه بهت میده.
بعد دوباره تاریخ شمسی رو بنویس به جای تاریخ میلادی گرید:
grid.rows[i].cell[].text=tarikh shamsi

angel farahani
شنبه 09 فروردین 1393, 10:34 صبح
سپاس از شما ، ببخشید این
grid.rows[i].cell[].text=tarikh shamsi رو کجا باید بنویسم ؟ و اون 4 خط کد آخر را باید داخل حلقه بزارم ؟

aminireza65
شنبه 09 فروردین 1393, 11:45 صبح
کل این کد رو داخل حلقه for بنویسید.


System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar
DateTime d = new DateTime
d = grid.rows[i].cell[andis mored nazar].text
grid.rows[i].cell[andis mored nazar].text=p.GetDayOfMonth(d)+"/"+p.GetMonth(d)+"/"+p.GetYear(d)

angel farahani
شنبه 09 فروردین 1393, 14:27 عصر
من کد را به این صورت نوشتم اما این خطا رو میده : من کروشه و پرانتز هم گذاشتم اما بازم خطا می دهد : A new expression requires (), [], or {} after type

از تعریف متغیر d خطا می گیره با اینکه کروشه و پرانتز هم دادم ، کدهایی که نوشتم :



protected void GridView1_DataBound(object sender, EventArgs e) {
for (int i = 0; i < ShopGrid.Rows.Count - 1; i++)
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar
DateTime d =new DateTime;
d=Convert.ToDateTime(ShopGrid.Rows[i].Cells[3].Text);
ShopGrid.Rows[i].Cells[4].Text=p.GetDayOfMonth(d)+"/"+p.GetMonth(d)+"/"+p.GetYear(d);

}

}

angel farahani
یک شنبه 10 فروردین 1393, 20:42 عصر
دوستان کسی نمی دونه ایراد این کد من از چیه ؟ لطفا راهنمایی کنید که بتونم ازش استفاده کنم

mRizvandi
یک شنبه 10 فروردین 1393, 22:38 عصر
دوست عزیز شما وقتی از یک کلاس یک شی یا اصطلاحا یک نمونه می گیرید دارید متد سازنده اون رو صدا می زنید، پس پرانتزها رو فراموش نکنید.
; آخر خطوط هم فراموش نشه.
کد شما اینطوری اصلاح میشه:


protected void GridView1_DataBound(object sender, EventArgs e)
{
for (int i = 0; i < ShopGrid.Rows.Count - 1; i++)
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d =new DateTime();
d=Convert.ToDateTime(ShopGrid.Rows[i].Cells[3].Text);
ShopGrid.Rows[i].Cells[4].Text = p.GetDayOfMonth(d) + "/" + p.GetMonth(d) + "/" + p.GetYear(d);
}
}

angel farahani
یک شنبه 10 فروردین 1393, 22:43 عصر
ممنونم که جواب دادین ؛ حتما اعلام نتیجه میکنم :)

angel farahani
یک شنبه 10 فروردین 1393, 22:59 عصر
ممنونم ، درست شد ، اما دیدم سطر آخر گرید رو تبدیل نکرده بوده ، من -1 count رو در حلقه برداشتم . سپاس از شما

mRizvandi
یک شنبه 10 فروردین 1393, 23:04 عصر
من کد شما رو از لحاظ سینتکس بررسی کردم، اما ظاهرا اشکال منطقی هم داره.
این کد داره رویداد DataBound برای GridView1 رو مشخص می کنه اما شما دارید داخل گریدویوی ShopGrid رو تغییر می دهید.
کد رو برای رویداد گرید مد نظرتون ست کنید.
پیشنهاد می کنم از رویداد RowDataBound استفاده کنید.

angel farahani
یک شنبه 10 فروردین 1393, 23:13 عصر
بله اون رو متوجه شدم درست کردم ، فقط یه چیزی من برای گرید گزینه ویرایش گذاشتم ، اون رو که میزنم این خطا رو میده که مربوط به کد شمسی کردن هست ، از اون بخش convert ایراد میگیره

String was not recognized as a valid DateTime.

:ناراحت:

mRizvandi
دوشنبه 11 فروردین 1393, 13:48 عصر
چک کنید ببینید در زمانی که خطا میده چه مقداری رو می خواهد تبدیل کنه که به خطا برمیخوره.
اگر راه حلی پیدا نکردید، کد گرید و کد رویداد رو بذارید.

angel farahani
دوشنبه 11 فروردین 1393, 20:44 عصر
protected void ShopGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < ShopGrid.Rows.Count; i++)
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d = new DateTime();
d = Convert.ToDateTime(ShopGrid.Rows[i].Cells[4].Text);
ShopGrid.Rows[i].Cells[4].Text = p.GetDayOfMonth(d) + "/" + p.GetMonth(d) + "/" + p.GetYear(d);
}
}

این کد من هست و از خط
d = Convert.ToDateTime(ShopGrid.Rows[i].Cells[4].Text); ایراد می گیره . ممنون میشم راهنماییم کنید

aminireza65
دوشنبه 11 فروردین 1393, 21:06 عصر
موقعی که تاریخ میلادی رو میخوای درج کنی در دیتابیس از چی استفاده میکنی؟؟
اگه اونجا هم از کلاس datetime استفاده کنی حل میشه.

angel farahani
دوشنبه 11 فروردین 1393, 22:44 عصر
نوع آن را در پایگاه datetime دادم ، اما بازم ایراد می گیره ، نباید یک جور دیگه convert کنم تا نوع تاریخ رو بشناسه ؟؟؟ ممنونم

mRizvandi
دوشنبه 11 فروردین 1393, 23:27 عصر
در زمان اجرا تریس کنید مقدار ShopGrid.Rows[i].Cells[4].Text رو همینجا بذارید، هر چی که هست از این مقدار هست.
این تیکه کد رو انتخاب کنید و CTRL+D و بعدش CTRL+Q رو بزنید، مقدارش رو داخل Watch نشون میده.

angel farahani
دوشنبه 11 فروردین 1393, 23:31 عصر
مقدار d رو این نشون میده

{1/1/0001 12:00:00 AM}

mRizvandi
دوشنبه 11 فروردین 1393, 23:50 عصر
مقدار d رو این نشون میده

{1/1/0001 12:00:00 AM}

این تاریخ یعنی اینکه مقداری داخل گریدویو ندارید یا درست به دست نمی آد!
کد صقحه گریدویو و کد پر کردن گریدویو رو بذارید.

angel farahani
دوشنبه 11 فروردین 1393, 23:55 عصر
تاریخ قبلا در پایگاه درج شده من نوع تاریخ رو به datetime و date تغییر دادم ، که مشکل حل نشد


<asp:GridView ID="ShopGrid" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="shopid" DataSourceID="Shopds" PageSize="4" style="text-align: center" OnRowDataBound="ShopGrid_RowDataBound"> <Columns>
<asp:TemplateField ShowHeader="False" HeaderText="ویرایش و حذف">
<EditItemTemplate>
<asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Update" Text="به روز رسانی" />
&nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel" Text="لغو" />
</EditItemTemplate>
<ItemTemplate>
<asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Edit" Text="ویرایش" />
&nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Delete" Text="حذف" Width="51px" OnClientClick="return confirm('آیا از حذف مطمئن هستید؟');" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="shopid" HeaderText="کد" InsertVisible="False" ReadOnly="True" SortExpression="shopid" />
<asp:BoundField DataField="shopname" HeaderText="نام رستوران/فست فود" SortExpression="shopname" />
<asp:TemplateField HeaderText="نوع رستوران" SortExpression="shoptypeid">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="shoptypeds" DataTextField="shoptypename" DataValueField="shoptypeid" SelectedValue='<%# Bind("shoptypeid") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="shoptypeds" runat="server" ConnectionString="<%$ ConnectionStrings:OnlineResturansConnectionString %>" SelectCommand="SELECT * FROM [shoptype]"></asp:SqlDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Literal ID="Literal1" runat="server" Text='<%# shoptype(Eval("shoptypeid")) %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="تاریخ عضویت" SortExpression="registerdate">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" ReadOnly="True" Text='<%# Bind("registerdate") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("registerdate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="آدرس" SortExpression="address">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Height="50px" Text='<%# Bind("address") %>' TextMode="MultiLine"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("address") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="phone" HeaderText="شماره تماس" SortExpression="phone" />
<asp:TemplateField HeaderText="جزئیات بیشتر">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("shopid", "shopdetail.aspx?id={0}") %>' Text='<%# Eval("shopid", "جزئیات بیشتر") %>' Width="100px"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="Shopds" runat="server" ConnectionString="<%$ ConnectionStrings:OnlineResturansConnectionString %>" DeleteCommand="DELETE FROM [shop] WHERE [shopid] = @shopid" InsertCommand="INSERT INTO [shop] ([shopname], [shoptypeid], [registerdate], [address], [phone]) VALUES (@shopname, @shoptypeid, @registerdate, @address, @phone)" SelectCommand="SELECT [shopid], [shopname], [shoptypeid], [registerdate], [address], [phone] FROM [shop] ORDER BY [shopname] DESC" UpdateCommand="UPDATE [shop] SET [shopname] = @shopname, [shoptypeid] = @shoptypeid, [registerdate] = @registerdate, [address] = @address, [phone] = @phone WHERE [shopid] = @shopid">
<DeleteParameters>
<asp:Parameter Name="shopid" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="shopname" Type="String" />
<asp:Parameter Name="shoptypeid" Type="Byte" />
<asp:Parameter DbType="Date" Name="registerdate" />
<asp:Parameter Name="address" Type="String" />
<asp:Parameter Name="phone" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="shopname" Type="String" />
<asp:Parameter Name="shoptypeid" Type="Byte" />
<asp:Parameter DbType="Date" Name="registerdate" />
<asp:Parameter Name="address" Type="String" />
<asp:Parameter Name="phone" Type="String" />
<asp:Parameter Name="shopid" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>

mRizvandi
سه شنبه 12 فروردین 1393, 00:12 صبح
Cells[4] گریدویوی شما یک Label داره و در زمان اجرا این لیبل تبدیل به یک span میشه که متن داخلش قرار میگیره. به همین دلیل وقتی شما Cells[4].Text رو میگیرید کل تگ داخلش رو میگیرید.
توی کدتون این تغییر رو بدید ببینید حل میشه:
(چون کدتون در رویداد RowDataBound هست دیگه نیازی به حلقه نیست.)


protected void ShopGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d = new DateTime();
d = Convert.ToDateTime(((Label)e.Row.FindControl("Label2")).Text);
e.Row.Cells[4].Text = p.GetDayOfMonth(d) + "/" + p.GetMonth(d) + "/" + p.GetYear(d);
}
}

angel farahani
سه شنبه 12 فروردین 1393, 00:17 صبح
ممنونم که وقت میزارید ، نه مقدارش رو چک کردم همون {1/1/0001 12:00:00 AM} هست و خطای Object reference not set to an instance of an object. رو میده .

angel farahani
سه شنبه 12 فروردین 1393, 12:31 عصر
دوستان در حالت نمایش گرید ، تاریخ رو شمسی نشون می دهد ، اما چون من در گرید گزینه ویرایش گذاشتم ، اون رو میزنم که رکورد رو ویرایش کنم از کد

d = Convert.ToDateTime(((Label)e.Row.FindControl("Labe l2")).Text); ، ایراد می گیره

Object reference not set to an instance of an object.

، حالا من فیلد تاریخ رو readonly کردم که امکان تغییر رو نداشته باشه ولی خوب چرا ایراد از ویرایش می گیره .
واقعا ممنونم که وقت میزارید :خجالت:

aminireza65
سه شنبه 12 فروردین 1393, 12:37 عصر
الان که read only کردی بازم ایراد میگیره؟؟

mRizvandi
سه شنبه 12 فروردین 1393, 13:12 عصر
اگر می خواهید تاریخ عضویت توسط کاربر تغییر نکند اون رو از حالت ویرایش خارج کنید، کافی است که EditTemplate رو بردارید، اگر خطا داشتید، به جای TextBox از Label استفاده کنید.
ReadOnly کردن تاثیری در موضوع ویرایش ردیف در گریدویو ایجاد نمی کنه. فقط TextBox رو فقط خواندنی می کنه.

angel farahani
سه شنبه 12 فروردین 1393, 13:34 عصر
ممنونم ، بله Label گذاشتم ، اما باز از خطی که d مقدار می گیره خطا می گیره در هنگام ویرایش کردن

mRizvandi
سه شنبه 12 فروردین 1393, 18:48 عصر
خط آخر RowDataBound رو به این شکل تغییر بدید، ببینید مساله حل میشه:


((Label)e.Row.FindControl("lblDate")).Text = p.GetDayOfMonth(d) + "/" + p.GetMonth(d) + "/" + p.GetYear(d);

اگر جواب نگرفتید خط مربوط به شرط رو تغییر بدید:


if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowState!=DataControlRowState.Edit)

مورد دیگه ای به ذهنم نمیرسه.

zohreh_av
چهارشنبه 15 شهریور 1396, 23:47 عصر
نحوه استفاده از تقویم شمسی در asp.net و نمایش رویداد های خاص

ابتدا به نحوه کلی استفاده از تقویم یا تاریخ شمسی در Asp.net (http://www.yasict.com/%D9%86%D8%AD%D9%88%D9%87%20%D8%A7%D8%B3%D8%AA%D9%8 1%D8%A7%D8%AF%D9%87%20%D8%A7%D8%B2%20%D8%AA%D8%A7% D8%B1%DB%8C%D8%AE%20%D8%B4%D9%85%D8%B3%DB%8C-yasA267) می پردازیم.



در مرحله اول فایل های css، jquery و اسکریپت مورد نیاز را در پروژه اضافه می کنیم:
http://yasict.com/CuteEditorImageGallary/admin/images/reference(2).jpg


نحوه کلی استفاده از تاریخ شمسی به صورت زیر می باشد:
http://yasict.com/CuteEditorImageGallary/admin/images/calendar(2).jpg


هنگامی که روی باکس تاریخ کلیک کنیم، تقویم شمسی به صورت زیر نمایش داده می شود:
http://yasict.com/CuteEditorImageGallary/admin/images/cal3.jpg



اگر بخواهیم مقدار انتخاب شده را در متغیر داشته باشیم و در قسمت کد برنامه از آن استفاده کنیم، میتوانیم از کنترل textbox استفاده کنیم:
http://yasict.com/CuteEditorImageGallary/admin/images/calendar2(1).jpg


در قسمت کد برنامه براحتی تاریخ انتخاب شده از متن textbox قابل دریافت است:
http://yasict.com/CuteEditorImageGallary/admin/images/cal5(1).jpg

تا اینجا نحوه کلی استفاده از تاریخ شمسی در asp.net را بیان نمودیم. حال میخواهیم تقویم شمسی را به گونه ای تنظیم کنیم که فقط رویدادهایی در تاریخ های خاص قابل انتخاب باشند.
ابتدا می بایست تاریخ رویداد های مورد نظر را در یک لیست داشته باشیم. سپس لیست رویداد ها را به تقویم شمسی متصل نماییم.
http://yasict.com/CuteEditorImageGallary/admin/images/cal6.jpg



به فراخوانی وب متد قبل از متد GetAllEventDates توجه کنید.


اتصال لیست رویداد ها به تقویم شمسی با استفاده از json به صورت زیر انجام می شود:
http://yasict.com/CuteEditorImageGallary/admin/images/cal7(1).jpg



حال به وب سایت بازگشته و پس از بارگذاری مجدد صفحه و باز کردن تقویم، مشاهده می کنیم که فقط تاریخ هایی که در لیست رویداد ها موجود بودند قابل انتخاب می باشند.
http://yasict.com/CuteEditorImageGallary/admin/images/cal8.jpg


شما می توانید پروژه ساده انتخاب تاریخ شمسی در asp.net و تنظیم تقویم بر روی تاریخ رویدادهای خاص را از لینک زیر دانلود نمایید:
پروژه انتخاب تاریخ شمسی و نمایش رویداد های خاص (http://yasict.com/CuteEditorImageGallary/admin/files/TaghvimShamsi(1)(1).zip)