線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5264
推到 Plurk!
推到 Facebook!

VS2003 C# - DataGrid - 改變 Cell 顏色 , 字型 , 插入圖像

 
digitraveler
初階會員


發表:89
回覆:91
積分:46
註冊:2005-06-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-20 09:40:06 IP:59.127.xxx.xxx 訂閱
■ 完整文章及呈現效果範例請見  C# 源碼任務  http://tw.myblog.yahoo.com/bruce0211/article?mid=200




在網路上查到 , 要改變 DataGrid 的顯示外觀 , 加入一些顏色甚至圖片是非常麻煩的事 , 大致手法是透過修改 DataGridTableStyle , DataGridColumnStyle 等內部處理動作才能達到 , 程式碼也非常複雜 , 看完令人頭暈 ; 很懷念 Delphi / C Builder 開發工具的 VCL 的處理方式 , 為什麼 .NET 控件模版沒有像 VCL 模版類似的好用方法來處理 DataGrid 的顯示外觀 ; 後來花了半天時間研究 , 終於發現有跟人家不同的方式 , 而且是類似 VCL 的 OnDrawCell 事件處理來改變 DataGrid 的顯示外觀

■ 前置作業
我們知道 , DataGrid 要能顯示資料 , 需在背後綁定一個資料來源(DataSource) , 所以前置作業如下 , 先在 Form 上放置一個 DataGrid 控件 , 拉好適當大小 , 綁定 DataSource , 在 Form Load 事件中用程式碼設定 DataGrid 控件 的外型屬性


[code c#]
private void Form1_Load(object sender, System.EventArgs e)
{
//設定 dataGrid1 基本屬性
dataGrid1.CaptionVisible=false; //不要秀 caption
//dataGrid1.ColumnHeadersVisible=false; //不要秀 FixRow
//dataGrid1.AlternatingBackColor=Color.WhiteSmoke; //偶數列顏色
dataGrid1.RowHeadersVisible=false; //不要秀 FixedCol;
dataGrid1.AllowSorting=false; //不要排序鈕
dataGrid1.ReadOnly=true; //尾巴不要有新的空白列
dataGrid1.Enabled=false; //只能由程式編輯資料


//DataGridTableStyle DGStyle;
//DataGridColumnStyle GridTextColumn, GridBmpColumn;


dataGrid1.DataSource=MakeMemTable(); //建立一個 MemTable 結構
}

//制定 MemTable 結構內容
private DataTable MakeMemTable()
{
DataTable MemTable = new DataTable("MemTable1");


//建立 MemTable 四種基本型態的欄位 (字串)
MemTable.Columns.Add("textbox1",System.Type.GetType("System.String"));
MemTable.Columns.Add("textbox2",System.Type.GetType("System.String"));
MemTable.Columns.Add("textbox3",System.Type.GetType("System.String"));
MemTable.Columns.Add("textbox4",System.Type.GetType("System.String"));

//Append 四列
MemTable.Rows.Add(MemTable.NewRow());
MemTable.Rows.Add(MemTable.NewRow());
MemTable.Rows.Add(MemTable.NewRow());
MemTable.Rows.Add(MemTable.NewRow());


//不要在空白 Cell 顯示難看的 "(null)" 字樣
for (int x=1; x<=4; x )
{
for (int y=0; y<=MemTable.Rows.Count-1; y )
{
MemTable.Rows[y][x-1]="";
}
}
//預先填入的假資料
MemTable.Rows[0][1]="123";
MemTable.Rows[1][1]="456";
MemTable.Rows[2][1]="789";
MemTable.Rows[3][1]="012";


return MemTable;

}
[/code]

■ 改變 Cell 顏色字型 , 插入圖像

需要動用到 DataGrid 的 OnPaint 及 OnScroll 兩個事件 , 假設我們想把 第一行 (即 Col=1) 全變色並改變字型 , 把最後一行 (Col=3) 插入圖片


[code c#]

private void dataGrid1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

DataGrid dg=(DataGrid)sender;
DataTable tb=(DataTable)dg.DataSource;

//模擬 VCL 事件 OnDrawCell()
for (int ACol=0; ACol<=tb.Columns.Count-1; ACol )
for (int ARow=0; ARow<=tb.Rows.Count-1; ARow )
{
string cell_text=tb.Rows[ARow][ACol].ToString();
int cell_left = dg.GetCellBounds(ARow,ACol).Left;
int cell_top = dg.GetCellBounds(ARow,ACol).Top;
int cell_width = dg.GetCellBounds(ARow,ACol).Width;
int cell_height= dg.GetCellBounds(ARow,ACol).Height;
Color cell_backColor = Color.Thistle;
Color cell_foreColor = Color.Black;
int x=cell_left 1;
int y=cell_top 1;
int x_width=cell_width-2;
int y_height=cell_height-1;


//特殊條件處理 (當 Col=1 改變字體及 Cell 顏色)
if (ACol==1)
{


//填滿 cell 底色
e.Graphics.FillRectangle(new SolidBrush(cell_backColor), x, y, x_width, y_height);

//設定 cell 顯示字體樣式
StringFormat format1 = new StringFormat();
//format1.Trimming= StringTrimming.EllipsisWord;
format1.Alignment=StringAlignment.Center;
Font font = new Font(FontFamily.GenericSansSerif,
10.0F,
FontStyle.Bold);

//繪出 cell 字體
e.Graphics.DrawString(cell_text,
font,
new SolidBrush(cell_foreColor),
new RectangleF(x, y, x_width, y_height),
format1);


}

//特殊條件處理 (當 Col=3 秀出一張圖片)
if (ACol==3)
{
//繪出 圖檔 (相信大家可以修改成因條件而顯示不同圖片)
Bitmap MyBmp = new Bitmap("c:\\1.jpg"); //C# Bitmap 還真好用, 可以直接吃非 bmp 檔
e.Graphics.DrawImage(MyBmp, new RectangleF(x, y, x_width, y_height));
}

}


}
//當滑鼠捲動 DataGrid 時 , 也要觸發 OnPaint 事件重匯我們要的外觀
private void dataGrid1_Scroll(object sender, System.EventArgs e)
{
DataGrid dg=(DataGrid)sender;
dg.Refresh();
}

[/code]
編輯記錄
digitraveler 重新編輯於 2009-08-20 09:42:18, 註解 無‧
digitraveler 重新編輯於 2009-08-20 09:43:16, 註解 無‧
digitraveler 重新編輯於 2009-08-20 09:48:31, 註解 無‧
digitraveler 重新編輯於 2009-08-20 15:23:37, 註解 無‧
digitraveler 重新編輯於 2009-08-20 15:24:49, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-20 10:11:32 IP:60.248.xxx.xxx 未訂閱
發文貼錯區了唷
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-20 10:17:03 IP:122.116.xxx.xxx 訂閱
幫忙移區 ^_^
系統時間:2024-05-01 12:44:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!