VS2003 C# - DataGrid - 改變 Cell 顏色 , 字型 , 插入圖像 |
|
digitraveler
初階會員 發表:89 回覆:91 積分:46 註冊:2005-06-01 發送簡訊給我 |
■ 完整文章及呈現效果範例請見 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 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |