『转载』C# winform 中dataGridView的重绘(进度条,虚线,单元格合并等)

原文转载自:http://hi.baidu.com/suming/item/81e45b1ab9b4585f2a3e2243

 

最近比较浅的研究了一下dataGridView的重绘,发现里面还是有很多东西可以学习的,摘录如下(其实就是在dataGridView1_CellPainting写一些代码)

主要代码:

 

  1    int top = 0;
  2    int left = 0;
  3    int height = 0;
  4    int width1 = 0;
  5    /// <summary>
  6    /// 窗体的重绘事件
  7    /// </summary>
  8    /// <param name="sender"></param>
  9    /// <param name="e"></param>
 10    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
 11    {
 12        /** 表头处理*************************************/
 13        if (e.RowIndex == -1)
 14        {
 15            if (e.ColumnIndex == 0 || e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3 || e.ColumnIndex == 4 || e.ColumnIndex == 5)
 16            {
 17                top = e.CellBounds.Top;
 18                left = e.CellBounds.Left - 1;
 19                height = e.CellBounds.Height;
 20                width1 = e.CellBounds.Width;
 21                Rectangle rect1 = new Rectangle(left, top, width1, e.CellBounds.Height);
 22                //表头第一列
 23                if (e.ColumnIndex == 0)
 24                {
 25                    using (Brush backColorBrush = new SolidBrush(Color.Blue))
 26                    {
 27                        //抹去原来的cell背景
 28                        e.Graphics.FillRectangle(backColorBrush, rect1);
 29                    }
 30                }
 31                //表头第二列
 32                else if (e.ColumnIndex == 1)
 33                {
 34                    using (Brush backColorBrush = new SolidBrush(Color.Orange))
 35                    {
 36                        //抹去原来的cell背景
 37                        e.Graphics.FillRectangle(backColorBrush, rect1);
 38                    }
 39                }
 40                //表头第三列
 41                else if (e.ColumnIndex == 2)
 42                {
 43                    using (Brush backColorBrush = new SolidBrush(Color.Orange))
 44                    {
 45                        //抹去原来的cell背景
 46                        e.Graphics.FillRectangle(backColorBrush, rect1);
 47                    }
 48                }
 49                //表头第四列
 50                else if (e.ColumnIndex == 3)
 51                {
 52                    using (Brush backColorBrush = new SolidBrush(Color.Orange))
 53                    {
 54                        //抹去原来的cell背景
 55                        e.Graphics.FillRectangle(backColorBrush, rect1);
 56                    }
 57                }
 58                //表头第五列
 59                else if (e.ColumnIndex == 4)
 60                {
 61                    using (Brush backColorBrush = new SolidBrush(Color.Blue))
 62                    {
 63                        //抹去原来的cell背景
 64                        e.Graphics.FillRectangle(backColorBrush, rect1);
 65                    }
 66                }
 67                //表头第六列
 68                else if (e.ColumnIndex == 5)
 69                {
 70                    using (Brush backColorBrush = new SolidBrush(Color.Blue))
 71                    {
 72                        //抹去原来的cell背景
 73                        e.Graphics.FillRectangle(backColorBrush, rect1);
 74                    }
 75                }
 76                using (Pen gridLinePen = new Pen(Color.Green , 1))
 77                {
 78                    //绘出上线
 79                    e.Graphics.DrawLine(gridLinePen, left, top, left + width1, top);
 80                    //绘出下线
 81                    e.Graphics.DrawLine(gridLinePen, left, top + height, left + width1, top + height);
 82                    //绘出左线
 83                    e.Graphics.DrawLine(gridLinePen, left, top, left, top + height);
 84                    string columnValue = "";
 85                    //计算绘制字符串的位置
 86                    if (e.ColumnIndex == 0)
 87                    {
 88                        columnValue = "零件号";
 89                    }
 90                    else if (e.ColumnIndex == 1)
 91                    {
 92                        columnValue = "8:00--11:59";
 93                    }
 94                    else if (e.ColumnIndex == 2)
 95                    {
 96                        columnValue = "12:00--16:59";
 97                    }
 98                    else if (e.ColumnIndex == 3)
 99                    {
100                        columnValue = "18:00--30:59";
101                    }
102                    else if (e.ColumnIndex == 4)
103                    {
104                        columnValue = "进度";
105                    }
106                    else if (e.ColumnIndex == 5)
107                    {
108                        columnValue = "进度率";
109                    }
110                    SizeF sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
111                    float lstr = (width1 - sf.Width) / 2;
112                    //float rstr = sf.Height/2;
113                    float rstr = (height - sf.Height) / 2;
114                    //画出文本框
115   
116                    if (columnValue != "")
117                    {
118                        e.Graphics.DrawString(columnValue, e.CellStyle.Font,
119                                                   new SolidBrush(Color.White),
120                                                     left + lstr,
121                                                     top + rstr,
122                                                     StringFormat.GenericDefault);
123                    }
124                }
125                e.Handled = true;
126            }
127   
128        }
129         /** 内容处理*************************************/
130        else
131        {
132            if (e.ColumnIndex == 0 || e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3 || e.ColumnIndex == 4 || e.ColumnIndex == 5)
133            {
134                top = e.CellBounds.Top;
135                left = e.CellBounds.Left - 1;
136                height = e.CellBounds.Height;
137                width1 = e.CellBounds.Width;
138                Rectangle rect1 = new Rectangle(left, top, width1, e.CellBounds.Height);
139                //内容第一列
140                if (e.ColumnIndex == 0)
141                {
142                    using (Brush backColorBrush = new SolidBrush(Color.LightGreen))
143                    {
144                        //抹去原来的cell背景
145                        e.Graphics.FillRectangle(backColorBrush, rect1);
146                    }
147                }
148                //内容第二列
149                else if (e.ColumnIndex == 1)
150                {
151                    using (Brush backColorBrush = new SolidBrush(Color.White))
152                    {
153                        //抹去原来的cell背景
154                        e.Graphics.FillRectangle(backColorBrush, rect1);
155                    }
156                }
157                //内容第三列
158                else if (e.ColumnIndex == 2)
159                {
160                    using (Brush backColorBrush = new SolidBrush(Color.White))
161                    {
162                        //抹去原来的cell背景
163                        e.Graphics.FillRectangle(backColorBrush, rect1);
164                    }
165                }
166                //内容第四列
167                else if (e.ColumnIndex == 3)
168                {
169                    using (Brush backColorBrush = new SolidBrush(Color.White))
170                    {
171                        //抹去原来的cell背景
172                        e.Graphics.FillRectangle(backColorBrush, rect1);
173                    }
174                }
175                //内容第五列
176                else if (e.ColumnIndex == 4)
177                {
178                    using (Brush backColorBrush = new SolidBrush(Color.LightGreen))
179                    {
180                        //抹去原来的cell背景
181                        e.Graphics.FillRectangle(backColorBrush, rect1);
182                    }
183                }
184                //内容第六列
185                else if (e.ColumnIndex == 5)
186                {
187                    using (Brush backColorBrush = new SolidBrush(Color.LightGreen))
188                    {
189                        //抹去原来的cell背景
190                        e.Graphics.FillRectangle(backColorBrush, rect1);
191                    }
192                }
193                using (Pen gridLinePen = new Pen(Color.Green, 1))
194                {
195                    //绘出左线
196                    e.Graphics.DrawLine(gridLinePen, left, top, left, top + height);
197                     
198                }
199                //绘出进度率的线
200                if (e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3)
201                {
202                    string str = e.Value.ToString();
203                    int index =str.LastIndexOf ("/");
204                    int widths = Convert.ToInt32(Convert.ToDouble(str.Substring(0, index)) / Convert.ToDouble(str.Substring(index + 1)) * width1);
205                    if (widths > width1)
206                    {
207                        widths = width1;
208                    }
209                    using (Pen gridLinePen = new Pen(Color.Blue, Convert.ToInt32(height / 3)))
210                    {
211   
212                        e.Graphics.DrawLine(gridLinePen, left, top + height / 2 + Convert.ToInt32(height / 3), left + widths, top + height / 2 + Convert.ToInt32(height /3));
213   
214                    }
215                }  
216                //画出上下线,中线和单元格的数据
217                using (Pen gridLinePen = new Pen(Color.Green , 1))
218                {
219                    float[] BlueValues = { 1, 1,1, 1 };
220                    gridLinePen.DashPattern = BlueValues;
221                    //绘出上线
222                    e.Graphics.DrawLine(gridLinePen, left, top, left + width1, top);
223                    //绘出下线
224                    e.Graphics.DrawLine(gridLinePen, left, top + height, left + width1, top + height);
225                    if (e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3)
226                    {                          
227   
228                        //绘出中线
229                        e.Graphics.DrawLine(gridLinePen, left, top + height / 2, left + width1, top + height / 2);
230                        e.Graphics.DrawLine(gridLinePen, left + width1/4, top + height / 2, left + width1/4, top + height);
231                        e.Graphics.DrawLine(gridLinePen, left + width1 / 2, top + height / 2, left + width1 / 2, top + height);
232                        e.Graphics.DrawLine(gridLinePen, left + width1*3 / 4, top + height / 2, left + width1*3 / 4, top + height);
233                    }                       
234                       
235                    string columnValue =e.Value.ToString () ;
236                    SizeF sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
237                    float lstr = (width1 - sf.Width) / 2;
238                    //float rstr = sf.Height/2;
239                    float rstr = (height/2 - sf.Height) / 2;
240                    //画出文本框数据
241                    if (columnValue != "")
242                    {
243                        e.Graphics.DrawString(columnValue, e.CellStyle.Font,
244                                                   new SolidBrush(Color.Black),
245                                                     left + lstr,
246                                                     top + rstr,
247                                                     StringFormat.GenericDefault);
248                    }
249                }
250                e.Handled = true;
251            }
252        }
253    }

 

 

例图如下:

posted on 2014-05-27 10:37  InkFx  阅读(4447)  评论(3编辑  收藏  举报