PDA

View Full Version : سوال: برنامه نویسی برای فیلدهای DataGridView



AmirAmiri
پنج شنبه 30 اردیبهشت 1389, 23:26 عصر
سلام به تمام دوستان گرامی.
من برنامه ای ساده نوشتم که میخوام جنسیت اعضا رو توی DataGridView نشون بده اما تو بانک SQL برای تعیین جنسیت از smallint استفاده کردم و 0 نشان دهنده جنسیت مؤنث و 1 جنسیت مذکر است. حالا میخوام زمانه اجرا توی DataGridView به جای 0 و 1 متن مذکر یا مؤمث رو بنویسه. یک راهش اینه که به صورت دستی و با برنامه نویسی بعد از هر بار Fill کردن Table ، تمام رکوردهای DataGridView رو چک کنم و به جای عدد 0 متن مؤنث و به جای عدد 1 متن مذکر رو قرار بدم اما مشکل من اینجاست که به مرور زمان حجم بانک بالا میره و تعداد رکوردها خیلی زیاد میشه (بالای 100 هزار رکورد) و این کار که به صورت دستی و با برنامه نویسی بخوام روی DataGridView تغییر ایجاد کنم کمی سنگین و زمان بر خواهد بود میخواستم یه راهنمایی کنید و بگید چطوری میتونم دقیقا به همین خواسته ام برسم بدون اینکه برنامه متحمل پردازش زیادی بشه؟؟؟؟
تازه من یک فیلد تاریخ هم دارم که به میلادی هست و میخوام که تو DataGridView اون رو هم به شمسی تبدیل کنم به همین خاطر نیاز به برنامه نویسی برای هر سلول از DataGridView دارم.
لطفا کمکم کنید 90 درصد برنامه کامل شده و فعلا به همین مشکل گیر کردم.
با تشکر از کمکتون.

ebrahim1988
پنج شنبه 30 اردیبهشت 1389, 23:49 عصر
یه راهنمایی می کنم ولی کد نمیدم چون واقعا کار دارم
توی پایگاه داده یه جدول دیگه بساز که فقط 2 تا فیلد و 2 تا رکورد داره
اطلاعات رو به ترتیب اینجوری قرار بده:
1 مذکر
0 مونث
بعد با استفاده از inner join (داخل دستور select که نوشتی) نمایش رو از هر دو جدول join کن
یه سرچ در مورد استفاده از inner jojn کنی فکر کنم دیگه راحت به جواب برسی
امیدوارم تونسته باشم کمکی کرده باشم
موفق باشید!

AmirAmiri
جمعه 31 اردیبهشت 1389, 00:26 صبح
ممنون دوست عزیز که کمک کردین ولی من نمیخوام از این روش استفاده کنم چون در حقیقت به داده های خوده جدول نیاز دارم و فقط میخوام که تو DataGridView به صورت متنی نمایش داده بشه نه اینکه از بانک به صورت متنی بخونم. اگه میخواستم اینکارو بکنم میتونستم از Function در SQL استفاده کنم که خیلی هم راحت تر بود اما هدف من چیزه دیگه ایه.

ebrahim1988
جمعه 31 اردیبهشت 1389, 00:28 صبح
ممنون دوست عزیز که کمک کردین ولی من نمیخوام از این روش استفاده کنم چون در حقیقت به داده های خوده جدول نیاز دارم و فقط میخوام که تو DataGridView به صورت متنی نمایش داده بشه نه اینکه از بانک به صورت متنی بخونم. اگه میخواستم اینکارو بکنم میتونستم از Function در SQL استفاده کنم که خیلی هم راحت تر بود اما هدف من چیزه دیگه ایه.
فکر کنم متوجه منظور من نشدید
با inner join کار کردین؟ میدونین به چه دردی میخوره؟

behzadk
جمعه 31 اردیبهشت 1389, 09:37 صبح
انو باید در داخل دستور sql از case استفاده کنی


SELECT store_name, CASE store_name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Date
FROM Store_Information

در ضمن شما باید طوری برنامه هات رو بنویسی که کمتر به حلقه نیاز داشته باشی تا سرعت برنامه پایین نیاد

AmirAmiri
جمعه 31 اردیبهشت 1389, 12:43 عصر
دوست عزیز جناب behzadk خیلی ممنونم که کمک کردین اما دوستان توجه داشته باشید که مشکل من به هیچ عنوان ربطی به بانک SQL و کدهای سمت سرور نداره بلکه مشکل من تنها با شی DataGridView هستش لطفا تمرکز خودتون رو روی SQL نذارید.
فرض کنید که :
1) میخوام تمام تاریخ های میلادی درون DataGridView رو به تاریخ شمسی تبدیل کنم.
2) میخوام تو سلول جنسیت هر جا 0 بود بنویسه 'مؤنث' و هر جا 1 بود بنویسه 'مذکر'.
3) میخوام تو سلول انقضا هر جا 0 بود بنویسه 'تاریخ دار' و هر جا 1 بود بنویسه 'منقضی شده'.
چیزهایی مثله اینا رو در نظر داشته باشید. فرض کنید که تمام سلولها برای نمایش داده شدن نیاز به پردازش دارن و باید محاسباتی روشون انجام بشه مثل تبدیل تاریخ میلادی به تاریخ شمسی که در این صورت نمیشه از دستورات SQL استفاده کرد یا کلا چیزهایی که با دستورات SQL امکان پذیر نیست.
لطفا با این ذهنیت جلو برید و به SQL فکر نکنید. باید راهی برای override کردن توابع و متدهای DataGridView وجود داشته باشه. راهی که بشه برای هر ستون خاص یک کد متفاوت رو جاگزین کرد مثلا برای ستونی که تاریخ قرار داره ، کدی رو جایگزین کنیم که تاریخ میلادی رو از سلول بخونه و به تاریخ شمسی تبدیل کنه و در نهایت تاریخ شمسی رو در سلول نمایش بده. این کار باید برای فیلد تاریخ هر رکورد به صورت خودکار انجام بشه و نیاز به این نباشه که برنامه نویس بعد از هر بار SELECT گرفتن از بانک، مجبور بشه تمام رکوردهای DataGridView رو پیمایش کنه و تاریخ ها رو شمسی کنه... امیدوارم متوجه منظورم شده باشید.
لطفا با این ذهنیت جلو برید.
باز هم از همگی ممنونم.

mehdi.mousavi
شنبه 01 خرداد 1389, 15:59 عصر
سلام.
کافیه تا VirtualMode رو true کنید، سپس با استفاده از CellValueNeeded Event اقدام به دادن اطلاعات مورد نظر برای نمایش در سلول خاصی از DataGridView کنید. در واقع این مود برای مواقعی استفاده میشه که تعداد رکوردهایی که میخواهید در DataGridView نشون بدید زیاده، و تمایلی ندارید تا یه کپی از داده های مورد نظر رو جای دیگه ای نگهداری کنید.

برای اطلاعات بیشتر به این مقاله (http://www.informit.com/articles/article.aspx?p=446453&seqNum=6)، یا MSDN (http://msdn.microsoft.com/us-en/library/system.windows.forms.datagridview.aspx) رجوع کنید.

موفق باشید.

AmirAmiri
دوشنبه 03 خرداد 1389, 15:08 عصر
میشه یک مثال بزنید؟ نمیدونم توی این Event باید چه کار کنم؟

mehdi.mousavi
دوشنبه 03 خرداد 1389, 17:56 عصر
میشه یک مثال بزنید؟ نمیدونم توی این Event باید چه کار کنم؟

سلام.
تو لینکی که دادم مثال بود، چطور ندیدید؟
تابع OnCellValueNeeded رو لطفا در لینک قبل نگاه کنید...

موفق باشید.

AmirAmiri
دوشنبه 03 خرداد 1389, 19:26 عصر
راستش من که چیزی از اون مقاله نفهمیدم. وقتی خودم تو Event ی که گفتید برنامه مینویسم هیچ اتفاقی نمی افته اینم کدی که نوشتم.


private void dgvAddEdit_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.ColumnIndex == dgvAddEdit.Columns["TS"].Index)
{
int y, m, d;
DateTime dt = Convert.ToDateTime(e.Value.ToString());
y = Persian.GetYear(dt); m = Persian.GetMonth(dt); d = Persian.GetDayOfMonth(dt);
e.Value = y + "/" + m + "/" + d;
}
}


خاصیت VirtualMode=true کردم. نمیدونم مشکل از کجاست... مطمئنا من بلد نیستم... لطفا کمک کنید.

mehdi.mousavi
دوشنبه 03 خرداد 1389, 20:57 عصر
سلام.
لطفا پروژه کوچکی برای Reproduce کردن مشکل قرار بدید، تا بتونم خودم آزمایش کنم و ایراد رو پیدا کنم.

موفق باشید.


راستش من که چیزی از اون مقاله نفهمیدم. وقتی خودم تو Event ی که گفتید برنامه مینویسم هیچ اتفاقی نمی افته اینم کدی که نوشتم.
خاصیت VirtualMode=true کردم. نمیدونم مشکل از کجاست... مطمئنا من بلد نیستم... لطفا کمک کنید.