现在的位置: 首页 > 综合 > 正文

winform 中的 datagridview 添加 progressbar列 和 calendar 列

2012年07月29日 ⁄ 综合 ⁄ 共 6418字 ⁄ 字号 评论关闭

【转载】
步骤:
1、在项目新建类文件,并装入附件的源码,编译一次。
2、添加datagridview,属性-杂项-colums-选定某一列-改变columntype即可。

【DataGridViewProgressColumn】

 

//---------------------------------------------------------------------
//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY
//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
//PARTICULAR PURPOSE.
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
namespace Test
{
    
public class DataGridViewProgressColumn : DataGridViewImageColumn
    
{
        
public DataGridViewProgressColumn()
        
{
            CellTemplate 
= new DataGridViewProgressCell();
        }

    }


    
class DataGridViewProgressCell : DataGridViewImageCell
    
{
        
// Used to make custom cell consistent with a DataGridViewImageCell
        static Image emptyImage;
        
static DataGridViewProgressCell()
        
{
            emptyImage 
= new Bitmap(11, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        }

        
public DataGridViewProgressCell()
        
{
            
this.ValueType = typeof(int);
        }

        
// Method required to make the Progress Cell consistent with the default Image Cell. 
        
// The default Image Cell assumes an Image as a value, although the value of the Progress Cell is an int.
        protected override object GetFormattedValue(object value,
                            
int rowIndex, ref DataGridViewCellStyle cellStyle,
                            TypeConverter valueTypeConverter,
                            TypeConverter formattedValueTypeConverter,
                            DataGridViewDataErrorContexts context)
        
{
            
return emptyImage;
        }


        
protected override void Paint(System.Drawing.Graphics g,
            System.Drawing.Rectangle clipBounds,
            System.Drawing.Rectangle cellBounds,
            
int rowIndex,
            DataGridViewElementStates cellState,
            
object value,
            
object formattedValue,
            
string errorText,
            DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle,
            DataGridViewPaintParts paintParts)
        
{            
            
if (value==null)
            
{
                
throw new ArgumentNullException();                
            }

            
int progressVal = (int)value;
            
float percentage = ((float)progressVal / 100.0f); // Need to convert to float before division; otherwise C# returns int which is 0 for anything but 100%.
            Brush backColorBrush = new SolidBrush(cellStyle.BackColor);
            Brush foreColorBrush 
= new SolidBrush(cellStyle.ForeColor);
            
// Draws the cell grid
            base.Paint(g, clipBounds, cellBounds,
             rowIndex, cellState, value, formattedValue, errorText,
             cellStyle, advancedBorderStyle, (paintParts 
& ~DataGridViewPaintParts.ContentForeground));
            
if (percentage > 0.0)
            
{
                
// Draw the progress bar and the text
                g.FillRectangle(new SolidBrush(Color.FromArgb(163189242)), cellBounds.X + 2, cellBounds.Y + 2, Convert.ToInt32((percentage * cellBounds.Width - 4)), cellBounds.Height - 4);
                g.DrawString(progressVal.ToString() 
+ "%", cellStyle.Font, foreColorBrush, cellBounds.X + 6, cellBounds.Y + 2);
            }

            
else
            
{
                
// draw the text
                if (this.DataGridView.CurrentRow.Index == rowIndex)
                    g.DrawString(progressVal.ToString() 
+ "%", cellStyle.Font, new SolidBrush(cellStyle.SelectionForeColor), cellBounds.X + 6, cellBounds.Y + 2);
                
else
                    g.DrawString(progressVal.ToString() 
+ "%", cellStyle.Font, foreColorBrush, cellBounds.X + 6, cellBounds.Y + 2);
            }

        }

    }

}

 

【CalendarColumn】

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace Test
{
    
public class CalendarColumn : DataGridViewColumn
    
{
        
private bool showUpDown = true;
        
public bool ShowUpDown
        
{
            
get
            
{
                
return showUpDown;
            }

            
set
            
{
                showUpDown 
= value;
            }

        }

        
public CalendarColumn()
            : 
base(new CalendarCell())
        
{
        }

        
public override DataGridViewCell CellTemplate
        
{
            
get
            
{
                
return base.CellTemplate;
            }

            
set
            
{
                
if (value != null &&
                
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
                
{
                    
throw new InvalidCastException("Must be a CalendarCell");
                }

                
base.CellTemplate = value;
            }

        }

        
private void InitializeComponent()
        
{
        }

    }


    
public class CalendarCell : DataGridViewTextBoxCell
    
{
        
public CalendarCell()
            : 
base()
        
{
        }

        
public override void InitializeEditingControl(int rowIndex, object
        initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        
{
            
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            CalendarEditingControl ctl 
=
            DataGridView.EditingControl 
as CalendarEditingControl;
            ctl.Text 
= this.Value.ToString();
        }

        
public override Type EditType
        
{
            
get
            
{
                
return typeof(CalendarEditingControl);
            }

        }

        
public override Type ValueType
        
{
            
get
            
{
                
return typeof(DateTime);
            }

        }

        
public override object DefaultNewRowValue
        
{
            
get
            
{
                
return DateTime.Now;
            }

        }

    }


    
class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
    
{
        DataGridView dataGridView;
        
private bool valueChanged = false;
        
int rowIndex;
        
public CalendarEditingControl()
        
{
        }

        
public object EditingControlFormattedValue
        
{
            
get
            
{
                
return this.Value.ToLongDateString();
            }

            
set

抱歉!评论已关闭.