PDA

View Full Version : سوال: نمایش صحیح فرمت تاریخ شمسی



دلتنگ اسمان
سه شنبه 27 مهر 1395, 09:59 صبح
با سلام
بنده تاریخ رو در دیتابیس(اکسس) بصورت میلادی ذخیره میکنم. حالا موقع نمایش بعد از تبدیل به تاریخ شمسی میخوام در دیتاگرید نشون بدم اما با فرمت میلادی نشون میده یعنی بصورت : 7/25/1395
با کد زیر به شمسی برمیگردونم که در این حالت فرمتش درسته ولی در دیتاگرید درست نشون نمیده:

string.Format(@"{0}/{1}/{2}",
PersianCalendar1.GetYear(datetime),
PersianCalendar1.GetMonth(datetime),
PersianCalendar1.GetDayOfMonth(datetime));
حالا نمیدونم چیکار کنم که فرمت تاریخ رو درست نشون بده.

juza66
سه شنبه 27 مهر 1395, 10:37 صبح
سلام

چطور دیتاگریدت رو پر میکنی تا بگم چیکار کنی

دلتنگ اسمان
سه شنبه 27 مهر 1395, 11:23 صبح
dataGridView1.DataSource = dtS;
dtS دیتاتیبلی است که با دستور select پر میشه.
با متد زیر :

public DataTable selectAll_from_Kala(string codemelliP, string DateTime)
{
con = new OleDbConnection(); cmd = new OleDbCommand(); dt = new DataTable(); sda = new OleDbDataAdapter();
conOpen();

cmd.Parameters.Clear();
cmd.CommandText = "SELECT * from kala where (codemelliPresenter=@codemelliPresenter AND datekala >= @datekala)";

cmd.Parameters.AddWithValue("@codemelliPresenter", codemelliP);
cmd.Parameters.AddWithValue("@datekala", DateTime);

cmd.ExecuteNonQuery();
con.Close();

sda.SelectCommand = cmd;
sda.Fill(dt);

return dt;
}


dtS = con.selectAll_from_Kala(nationalCode);

juza66
سه شنبه 27 مهر 1395, 12:50 عصر
foreach (DataRow dr in dt.Rows)
{
dr["datekala"] = Shamsi(dr["datekala"].ToString());
}


یک حلقه مینویسی و مقدار فیلد تاریخ رو در تابع مثلا شمسی میفرستی و در تابع تبدیل رو انجام میدی و retrun میکنی ..

دلتنگ اسمان
سه شنبه 27 مهر 1395, 13:14 عصر
متاسفانه باز هم با همون فرمت نشون میده.
فکر میکنم چون فرمت ستون datekala در دیتاتیبل از نوع Datetime هستش به هر صورت که دیتا بریزی به همون فرمت تبدیل میکنه. باید Type این ستون رو عوض کنم.
که موفق نشدم.
143069
تا قبل از اینکه تاریخ رو وارد سلول کنی فرمتش درسته. اما وقتی تاریخ رو وارد سلول میکنی و بعد نشون میدی همون فرمت قبلی نشون میده.

این هم نمایش:
143070

daniyaltjm
سه شنبه 27 مهر 1395, 13:18 عصر
سلام ببخشید نمیشه از نوع رشته توی بانک استفاده کرد؟

دلتنگ اسمان
سه شنبه 27 مهر 1395, 13:28 عصر
چرا نه اینکه نشه. اما برای مثلا دستورات مقایسه ای به مشکل برمیخوریم.
وقتی میخوای بین دو تاریخ رو پیدا کنی بصورت رشته ای که باشه مشکلات خاص خودشو داره

daniyaltjm
سه شنبه 27 مهر 1395, 13:34 عصر
اینطوری امتحان کن ببین درس میشه؟
string.Format(@"{0}/{1}/{2}",
PersianCalendar1.GetDayOfMonth(datetime),
PersianCalendar1.GetMonth(datetime),
PersianCalendar1.GetYear(datetime));

daniyaltjm
سه شنبه 27 مهر 1395, 13:35 عصر
چرا نه اینکه نشه. اما برای مثلا دستورات مقایسه ای به مشکل برمیخوریم.
وقتی میخوای بین دو تاریخ رو پیدا کنی بصورت رشته ای که باشه مشکلات خاص خودشو داره

خوب موقه ای که می خوای مقایسه کنی بیا تبدیل کن به DateTime!!!!

دلتنگ اسمان
سه شنبه 27 مهر 1395, 13:45 عصر
اینطوری امتحان کن ببین درس میشه؟
string.Format(@"{0}/{1}/{2}",
PersianCalendar1.GetDayOfMonth(datetime),
PersianCalendar1.GetMonth(datetime),
PersianCalendar1.GetYear(datetime));

این کار رو هم کردم به همون فرمت خودش نشون میده. اگه سال رو هم جابجا کنی خطا میده.

دلتنگ اسمان
سه شنبه 27 مهر 1395, 13:47 عصر
خوب موقه ای که می خوای مقایسه کنی بیا تبدیل کن به DateTime!!!!

بله . من میخواستم فقط برای نمایش ، به رشته تبدیل کنم و نشون بدم. و بقیه چیزها جای خودش با استاندارد خودش کار کنه. ولی ظاهرا باید به همون شیوه عمل کنم

دلتنگ اسمان
سه شنبه 27 مهر 1395, 14:02 عصر
با این شیوه درست نشون میده. فقط مشکل زمانی خودشو نشون میده که تعداد سطرهای دیتا گرید زیاد بشه. چون زمان بر خواهد بود

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
connection con = new connection();

dataGridView1.DataSource = dtS;

if (e.ColumnIndex == 6)

if (e.Value != null)

for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)

e.Value = con.miladiToshamsi(Convert.ToDateTime(dataGridView 1.Rows[i].Cells[6].Value.ToString()));


}

juza66
سه شنبه 27 مهر 1395, 18:27 عصر
سلام دوست عزیز

این روش رو ندیدم ولی پرفومنس کارت میاره پایین


شما بعد از دریافت دیتاتیبل ات از تابع قبل از اینکه پاسش بدی به دیتاگریدت تبدیل رو انجام بده بعدش پاس بده به دیتاتیبل ات و در اخر دیتاتیبل رو پاس بده به دیتاگریدت یعنی اینجوری



foreach (DataRow dr in dt.Rows)
{
dr["datekala"] = Convert.ToDateTime(dr["datekala"].ToString());

}
Datagridview.DataSource = dt;

Mahmoud.Afrad
سه شنبه 27 مهر 1395, 18:38 عصر
بلافاصله بعد از دریافت داده از دیتابیس، یک ستون به دیتاتیبل اضافه و با یک حلقه تاریخ تبدیل شده را در اون قرار بدید. میتونید ستون تاریخ میلادی رو در دیتاگرید مخفی کنید.

دلتنگ اسمان
سه شنبه 27 مهر 1395, 19:27 عصر
سلام دوست عزیز

این روش رو ندیدم ولی پرفومنس کارت میاره پایین


شما بعد از دریافت دیتاتیبل ات از تابع قبل از اینکه پاسش بدی به دیتاگریدت تبدیل رو انجام بده بعدش پاس بده به دیتاتیبل ات و در اخر دیتاتیبل رو پاس بده به دیتاگریدت یعنی اینجوری



foreach (DataRow dr in dt.Rows)
{
dr["datekala"] = Convert.ToDateTime(dr["datekala"].ToString());

}
Datagridview.DataSource = dt;






باز هم با همون فرمت نشون میده

juza66
سه شنبه 27 مهر 1395, 19:30 عصر
ایا این تابع است؟

con.miladiToshamsi(

دلتنگ اسمان
سه شنبه 27 مهر 1395, 19:38 عصر
بلافاصله بعد از دریافت داده از دیتابیس، یک ستون به دیتاتیبل اضافه و با یک حلقه تاریخ تبدیل شده را در اون قرار بدید. میتونید ستون تاریخ میلادی رو در دیتاگرید مخفی کنید.

این هم روش خوبیه. از همین استفاده کردم

دلتنگ اسمان
سه شنبه 27 مهر 1395, 19:40 عصر
ایا این تابع است؟

con.miladiToshamsi(

بله :

public string miladiToshamsi(DateTime datetime)
{

PersianCalendar PersianCalendar1 = new PersianCalendar();
return string.Format(@"{0}/{1}/{2}",
PersianCalendar1.GetYear(datetime),
PersianCalendar1.GetMonth(datetime),
PersianCalendar1.GetDayOfMonth(datetime));

}