悟生慧

 

怎么在DataGridView中动态添加DateTimePicker列?

using System;
using System.Windows.Forms;

namespace MasterSoft.WinUI
{
   
///<summary>
   
/// DataGridView 中的日历列
   
///</summary>
   
///<example >
   
/// DataGridViewCalendarColumn ordBillSubConsignmentDateDataGridViewCalendarColumn = new DataGridViewCalendarColumn();
   
/// ordBillSubConsignmentDateDataGridViewCalendarColumn .DataPropertyName = myOrdBillDataSet.OrdBillSub.OrdBillSubConsignmentDateColumn.ColumnName;
   
/// ordBillSubConsignmentDateDataGridViewCalendarColumn .HeaderText = "需求日期";
   
///</example>
    publicclass MDataGridViewCalendarColumn : DataGridViewColumn
    {
       
public MDataGridViewCalendarColumn()
            :
base(new CalendarCell())
        {
        }

       
publicoverride DataGridViewCell CellTemplate
        {
           
get
            {
               
returnbase.CellTemplate;
            }
           
set
            {
               
// Ensure that the cell used for the template is a CalendarCell.
                if (value !=null&&
                   
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
                {
                   
thrownew InvalidCastException("Must be a CalendarCell");
                }
               
base.CellTemplate = value;
            }
        }
    }
   
///<summary>
   
/// DataGridView 中的日历格
   
///</summary>
    publicclass CalendarCell : DataGridViewTextBoxCell
    {

       
public CalendarCell()
            :
base()
        {
           
// Use the short date format.
            this.Style.Format ="d";
        }

       
publicoverridevoid InitializeEditingControl(int rowIndex, object
            initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
           
// Set the value of the editing control to the current cell value.
            base.InitializeEditingControl(rowIndex, initialFormattedValue,
                dataGridViewCellStyle);
            CalendarEditingControl ctl
=
                DataGridView.EditingControl
as CalendarEditingControl;
           
try
            {
                ctl.Value
= (DateTime)this.Value;
            }
           
catch (Exception)
            {
                ctl.Value
= DateTime.Now;
            }
        }

       
publicoverride Type EditType
        {
           
get
            {
               
// Return the type of the editing contol that CalendarCell uses.
                returntypeof(CalendarEditingControl);
            }
        }

       
publicoverride Type ValueType
        {
           
get
            {
               
// Return the type of the value that CalendarCell contains.
                returntypeof(DateTime);
            }
        }

       
publicoverrideobject DefaultNewRowValue
        {
           
get
            {
               
// Use the current date and time as the default value.
                returnnull;
            }
        }
    }

   
class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
       
privatebool valueChanged =false;
       
int rowIndex;

       
public CalendarEditingControl()
        {
           
this.Format = DateTimePickerFormat.Short;
        }

       
// Implements the IDataGridViewEditingControl.EditingControlFormattedValue
       
// property.
        publicobject EditingControlFormattedValue
        {
           
get
            {
               
returnthis.Value.ToShortDateString();
            }
           
set
            {
                String newValue
= value as String;
               
if (newValue !=null)
                {
                   
this.Value = DateTime.Parse(newValue);
                }
            }
        }

       
// Implements the
       
// IDataGridViewEditingControl.GetEditingControlFormattedValue method.
        publicobject GetEditingControlFormattedValue(
            DataGridViewDataErrorContexts context)
        {
           
return EditingControlFormattedValue;
        }

       
// Implements the
       
// IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
        publicvoid ApplyCellStyleToEditingControl(
            DataGridViewCellStyle dataGridViewCellStyle)
        {
           
this.Font = dataGridViewCellStyle.Font;
           
this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
           
this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
        }

       
// Implements the IDataGridViewEditingControl.EditingControlRowIndex
       
// property.
        publicint EditingControlRowIndex
        {
           
get
            {
               
return rowIndex;
            }
           
set
            {
                rowIndex
= value;
            }
        }

       
// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
       
// method.
        publicbool EditingControlWantsInputKey(
            Keys key,
bool dataGridViewWantsInputKey)
        {
           
// Let the DateTimePicker handle the keys listed.
            switch (key & 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:
                   
returntrue;
               
default:
                   
returnfalse;
            }
        }

       
// Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
       
// method.
        publicvoid PrepareEditingControlForEdit(bool selectAll)
        {
           
// No preparation needs to be done.
        }

       
// Implements the IDataGridViewEditingControl
       
// .RepositionEditingControlOnValueChange property.
        publicbool RepositionEditingControlOnValueChange
        {
           
get
            {
               
returnfalse;
            }
        }

       
// Implements the IDataGridViewEditingControl
       
// .EditingControlDataGridView property.
        public DataGridView EditingControlDataGridView
        {
           
get
            {
               
return dataGridView;
            }
           
set
            {
                dataGridView
= value;
            }
        }

       
// Implements the IDataGridViewEditingControl
       
// .EditingControlValueChanged property.
        publicbool EditingControlValueChanged
        {
           
get
            {
               
return valueChanged;
            }
           
set
            {
                valueChanged
= value;
            }
        }

       
// Implements the IDataGridViewEditingControl
       
// .EditingPanelCursor property.
        public Cursor EditingPanelCursor
        {
           
get
            {
               
returnbase.Cursor;
            }
        }

       
protectedoverridevoid OnValueChanged(EventArgs eventargs)
        {
           
// Notify the DataGridView that the contents of the cell
           
// have changed.
            valueChanged =true;
           
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
           
base.OnValueChanged(eventargs);
        }
    }
}

MDataGridViewCalendarColumn mdc = new MDataGridViewCalendarColumn();
DataGridView dgv = new DataGridView();
dgv.Columns.Add(mdc);

posted on 2011-12-07 16:21  悟生慧  阅读(1889)  评论(0编辑  收藏  举报

导航