代码改变世界

DataGridView扩展:NumericUpDown ,并显示比例

2009-09-22 09:07  Zhang_Chen  阅读(965)  评论(0编辑  收藏  举报

代码是自己写的,实现功能:NumericUpDown编辑单元格,显示值与最大值的比例

using System;
using System.Drawing;
using System.Windows.Forms;

namespace CuteDataView
{
    
public class NumericUpDownColumn : DataGridViewColumn
    {
        
public NumericUpDownColumn(): base(new NumericUpDownCell())
        {
        }
        
public NumericUpDownColumn(decimal max, decimal min, decimal increment,decimal defaultValue,bool showRect,Color rectColor)
            : 
base(new NumericUpDownCell{Maximum=max,Minimum=min,DefaultValue=defaultValue,Increment=increment,RectColor=rectColor,ShowRect=showRect})
        {
        }

        
public decimal Maximum { getset; }
        
public decimal Minimum { getset; }
        
public decimal Increment { getset; }
        
public decimal DefaultValue { getset; }
        
public bool ShowRect { getset; }
        
public Color RectColor { getset; }

        
public override DataGridViewCell CellTemplate
        {
            
get { return base.CellTemplate; }
            
set
            {
                
if (value != null && !value.GetType().IsAssignableFrom(typeof (NumericUpDownCell)))
                {
                    
throw new InvalidCastException("Must   be   a   NumericUpDownCell ");
                }
                
base.CellTemplate = value;
            }
        }
    }

    
public class NumericUpDownCell : DataGridViewTextBoxCell
    {
        
public decimal Maximum { getset; }
        
public decimal Minimum { getset; }
        
public decimal Increment { getset; }
        
public decimal DefaultValue { getset; }
        
public bool ShowRect { getset; }
        
public Color RectColor { getset; }

        
public NumericUpDownCell()
        {
            Maximum 
= decimal.MaxValue;
            Minimum 
= decimal.MinValue;
            Increment 
= 1;
            DefaultValue 
= 0;
            ShowRect 
= false;
            RectColor 
= Color.FromArgb(50, Color.Magenta);
        }


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

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

        
public override object DefaultNewRowValue
        {
            
get { return DefaultValue; }
        }

        
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue,
                                                      DataGridViewCellStyle dataGridViewCellStyle)
        {
            
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            var ctl 
= DataGridView.EditingControl as NumericUpDownEditingControl;
            
if (ctl != null)
            {
                ctl.Maximum 
= Maximum;
                ctl.Minimum 
= Minimum;
                ctl.Increment 
= Increment;
                ctl.Text 
= Value.ToString();
            }
        }

        
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
                        
if (ShowRect)
            {
                graphics.FillRectangle(
new SolidBrush(RectColor), cellBounds.Left, cellBounds.Top, (cellBounds.Width / Convert.ToSingle(Maximum)) * Convert.ToSingle(Value), cellBounds.Height - 1);
            }
        }


        
public override object Clone()
        {
            
return new NumericUpDownCell
                       {
                           Maximum 
= Maximum,
                           Minimum 
= Minimum,
                           ShowRect 
= ShowRect,
                           RectColor 
= RectColor,
                           Increment 
= Increment,
                           DefaultValue 
= DefaultValue
                       };
        }

    }

    
internal class NumericUpDownEditingControl : NumericUpDown, IDataGridViewEditingControl
    {
        
#region Implementation of IDataGridViewEditingControl

        
private bool _editingControlValueChanged;

        
/// <summary>
        
/// Changes the control's user interface (UI) to be consistent with the specified cell style.
        
/// </summary>
        
/// <param name="dataGridViewCellStyle">The <see cref="T:System.Windows.Forms.DataGridViewCellStyle"/> to use as the model for the UI.
        
///                 </param>
        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            Font 
= dataGridViewCellStyle.Font;
            ForeColor 
= dataGridViewCellStyle.ForeColor;
            BackColor 
= dataGridViewCellStyle.BackColor;
        }

        
/// <summary>
        
/// Determines whether the specified key is a regular input key that the editing control should process or a special key that the <see cref="T:System.Windows.Forms.DataGridView"/> should process.
        
/// </summary>
        
/// <returns>
        
/// true if the specified key is a regular input key that should be handled by the editing control; otherwise, false.
        
/// </returns>
        
/// <param name="keyData"><see cref="T:System.Windows.Forms.Keys"/> that represents the key that was pressed.
        
///                 </param><param name="dataGridViewWantsInputKey">true when the <see cref="T:System.Windows.Forms.DataGridView"/> wants to process the <see cref="T:System.Windows.Forms.Keys"/> in <paramref name="keyData"/>; otherwise, false.
        
///                 </param>
        public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            
switch (keyData & Keys.KeyCode)
            {
                
case Keys.Left:
                
case Keys.Up:
                
case Keys.Down:
                
case Keys.Right:
                
case Keys.Home:
                
case Keys.End:
                
case Keys.PageDown:
                
case Keys.PageUp:
                    
return true;
                
default:
                    
return false;
            }
        }

        
/// <summary>
        
/// Retrieves the formatted value of the cell.
        
/// </summary>
        
/// <returns>
        
/// An <see cref="T:System.Object"/> that represents the formatted version of the cell contents.
        
/// </returns>
        
/// <param name="context">A bitwise combination of <see cref="T:System.Windows.Forms.DataGridViewDataErrorContexts"/> values that specifies the context in which the data is needed.
        
///                 </param>
        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            
return EditingControlFormattedValue;
        }

        
/// <summary>
        
/// Prepares the currently selected cell for editing.
        
/// </summary>
        
/// <param name="selectAll">true to select all of the cell's content; otherwise, false.
        
///                 </param>
        public void PrepareEditingControlForEdit(bool selectAll)
        {
        }

        
/// <summary>
        
/// Gets or sets the <see cref="T:System.Windows.Forms.DataGridView"/> that contains the cell.
        
/// </summary>
        
/// <returns>
        
/// The <see cref="T:System.Windows.Forms.DataGridView"/> that contains the <see cref="T:System.Windows.Forms.DataGridViewCell"/> that is being edited; null if there is no associated <see cref="T:System.Windows.Forms.DataGridView"/>.
        
/// </returns>
        public DataGridView EditingControlDataGridView { getset; }

        
/// <summary>
        
/// Gets or sets the formatted value of the cell being modified by the editor.
        
/// </summary>
        
/// <returns>
        
/// An <see cref="T:System.Object"/> that represents the formatted value of the cell.
        
/// </returns>
        public object EditingControlFormattedValue
        {
            
get { return Value.ToString(); }
            
set { Value = decimal.Parse(value.ToString()); }
        }

        
/// <summary>
        
/// Gets or sets the index of the hosting cell's parent row.
        
/// </summary>
        
/// <returns>
        
/// The index of the row that contains the cell, or –1 if there is no parent row.
        
/// </returns>
        public int EditingControlRowIndex { getset; }

        
/// <summary>
        
/// Gets or sets a value indicating whether the value of the editing control differs from the value of the hosting cell.
        
/// </summary>
        
/// <returns>
        
/// true if the value of the control differs from the cell value; otherwise, false.
        
/// </returns>
        public bool EditingControlValueChanged
        {
            
get { return _editingControlValueChanged; }
            
set { _editingControlValueChanged = value; }
        }

        
/// <summary>
        
/// Gets the cursor used when the mouse pointer is over the <see cref="P:System.Windows.Forms.DataGridView.EditingPanel"/> but not over the editing control.
        
/// </summary>
        
/// <returns>
        
/// A <see cref="T:System.Windows.Forms.Cursor"/> that represents the mouse pointer used for the editing panel. 
        
/// </returns>
        public Cursor EditingPanelCursor
        {
            
get { return base.Cursor; }
        }

        
/// <summary>
        
/// Gets or sets a value indicating whether the cell contents need to be repositioned whenever the value changes.
        
/// </summary>
        
/// <returns>
        
/// true if the contents need to be repositioned; otherwise, false.
        
/// </returns>
        public bool RepositionEditingControlOnValueChange
        {
            
get { return false; }
        }

        
#endregion

        
protected override void OnValueChanged(EventArgs eventargs)
        {
            _editingControlValueChanged 
= true;
            EditingControlDataGridView.NotifyCurrentCellDirty(
true);
            
base.OnValueChanged(eventargs);
        }
    }
}