PDA

View Full Version : Datagridview و CustomFormating



MH2538
چهارشنبه 26 اردیبهشت 1386, 08:18 صبح
سلام
اول ز همه اینکه در مورد موضوعی که می نویسم توی سایت گشتم ولی چیزی که بتونه منو به نتیجه برسونه پیدا نکردم.
مشکل اینه که من برای ورود /خروج کارمندان در بانک یک فیلد در نظر گرفتم و 0 رو برای ورود و 1 رو برای خروج توی اون بانک می ریزم.
اما وقتی می خوام اون رو توی Datagridview نمایش بدم همون صفر و یک میاد که طبیعی هم هست اما خیلی زشته !
شنیدم که با FormatString می شه یک کارهایی کرد که تو datagridview مثلاً به جای 0 بنویسه ورود و بجای 1 هم خروج اما من نتونستم این کار رو انجام بدم.
ممنون می شم راهنمایی کنید.

erahavard
چهارشنبه 26 اردیبهشت 1386, 08:51 صبح
اگر از sql server استفاده میکنی میتونی یک function بنویسی و از اون تو select استفاده کنی تا مقدار مورد نظر شما را برگردونه اینم یک مثال :
USE AdventureWorks;
GO
IF OBJECT_ID (N'dbo.ISOweek', N'FN') IS NOT NULL
DROP FUNCTION dbo.ISOweek;
GO
CREATE FUNCTION dbo.ISOweek (@DATE datetime)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END;
GO


SET DATEFIRST 1;
SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';

MH2538
چهارشنبه 26 اردیبهشت 1386, 08:58 صبح
من به راه حل زیر رسیدم ولی هنوز هم نمی دونم این واقعاً بهترین راه است یا خیر .
اگر راه بهتری وجود داره ممنون می شم راهنمایی کنید.
ضمناً با تشکر از erahavard، باید بگم من نمی خوام از SQLبرای حل این مشکل استفاده کنم.


private void dgvMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e){
if (e.ColumnIndex == 13)
e.Value = Convert.ToByte(e.Value.ToString()) == 1 ? "ورود" : "خروج";
}

mohebbi.saeed
چهارشنبه 26 اردیبهشت 1386, 09:00 صبح
سلام
منم همین کار رو کردم اما یک جای برنامه اشکال دارد
شما باید دو تا چیز را Set کنید
اول باید شما بگویید که آن ستون از نوع COmboBox است. بعد باید DisplayName که چیزی است که شما می توانید نشان بدهید را درست انتخاب کنید و ValueMember که این مقداری است که در پشت صحنه دارید از آن استفاده می کنید. که در اینجا 0و1 ValueMember و DisplayName شما مقداری است که می خواهید به کاربر نشان بدهید.

MH2538
چهارشنبه 26 اردیبهشت 1386, 09:17 صبح
سلام
چون این گرید فقط برای نمایش اطلاعات و به نوعی یک گزارش گیری است نیازی به ComboBox نیست چون اصلاً اطلاعات قابل تغییر نیستند.

hdv212
چهارشنبه 26 اردیبهشت 1386, 11:01 صبح
نوع داده ای که در sql استفاده کردید چیه ؟
من با این مورد زیاد کار کردم، بهتره در sql یه فیلد از نوع bit در نظر بگیرید، و وقتی dataGridView رو بهش بایند میکنید، در column هایی که ساخته میشن میبینید که فیلد مورد نظر شما به صورت checkBox اومده، این خیلی بهتره.

MH2538
چهارشنبه 26 اردیبهشت 1386, 11:44 صبح
سلام
hdv212 عزیز از راهنمائیت ممنون ولی مشکل من در اصل اینه که قضیه به یک ورود و خروج ختم نمی شه و حالت های مختلفی برای اون فیلد در نظر گرفته شده من برای سادگی کار فقط 2حالت در نظر گرفته بودم

mojsaket
چهارشنبه 26 اردیبهشت 1386, 12:19 عصر
یه راه ساده و با انعطاف بالا وجود داره که معایب خودشم داره.
میشه DataGridView رو بایند نکنی یا با DataSet بایند کنی .
بعد مستقیما فیلدها رو edit کنی.
YourGrid.Rows.cell[13].value
یا
yourDataSet.Tabels[0].Rows[i][j]=newValue

hdv212
چهارشنبه 26 اردیبهشت 1386, 13:22 عصر
میشه بگی حالتهای دیگه چیه تا اصل نتیجه ای که میخوای بگیری مشخص بشه، منم بتونم کمکت کنم.

ly.comeng
دوشنبه 18 شهریور 1387, 11:34 صبح
من به راه حل زیر رسیدم ولی هنوز هم نمی دونم این واقعاً بهترین راه است یا خیر .
اگر راه بهتری وجود داره ممنون می شم راهنمایی کنید.
ضمناً با تشکر از erahavard، باید بگم من نمی خوام از SQLبرای حل این مشکل استفاده کنم.


private void dgvMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e){
if (e.ColumnIndex == 13)
e.Value = Convert.ToByte(e.Value.ToString()) == 1 ? "ورود" : "خروج";
}



من هم همین مشکل را دارم،اما با نام ماه های سال.یک آرایه تعریف کردم


Dim month_name() As String = {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند"}



برای ماههای سال در فرمم کمبو دارم و با ایندکس ذخیره میشن.حالا نمیدونم در E.VALUE چطوری ایندکس ماه رو بگیره و نام رو نشون بده؟؟