MSDN範例: http://msdn.microsoft.com/zh-tw/library/7tas5c80(en-us,vs.80).aspx

Form1.cs

using System;

using System.Text;

using System.Windows.Forms;

namespace DatetimeColumnOfDgv

{

    public partial class Form1 : Form

    {

        private DataGridView dataGridView1 = new DataGridView();

        public Form1()

        {

            this.dataGridView1.Dock = DockStyle.Fill;

            this.Controls.Add(this.dataGridView1);

            this.Load += new EventHandler(Form1_Load);

            this.Text = "DataGridView calendar column demo";

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            CalendarColumn col = new CalendarColumn();

            col.SetDateTimeFormat("yyyy-MM-dd hh:mm:ss");

            this.dataGridView1.Columns.Add(col);

            this.dataGridView1.RowCount = 5;

            foreach (DataGridViewRow row in this.dataGridView1.Rows)

               row.Cells[0].Value = DateTime.Now;

        }

    }

}

DatetimeColumnOfDgv.cs

using System;

using System.Collections.Generic;

using System.Text;

namespace DatetimeColumnOfDgv

{

    using System;

    using System.Windows.Forms;

 

    public class CalendarColumn : DataGridViewColumn

    {

        public static CalendarCell cc = new CalendarCell();

        public void SetDateTimeFormat(string value)

        {

            cc.SetDateTimeStyleFormat(value);

        }

 

        public CalendarColumn()

            : base(cc)

        {

        }

 

        public override DataGridViewCell CellTemplate

        {

            get

            {

                return base.CellTemplate;

            }

            set

            {

                // Ensure that the cell used for the template is a CalendarCell.

                if (value != null &&

                    !value.GetType().IsAssignableFrom(typeof(CalendarCell)))

                {

                    throw new InvalidCastException("Must be a CalendarCell");

                }

                base.CellTemplate = value;

            }

        }

    }

 

    public class CalendarCell : DataGridViewTextBoxCell

    {

        public void SetDateTimeStyleFormat(string value)

        {

            this.Style.Format = value;

        }

        public CalendarCell()

            : base()

        {

            // Use the short date format.

            this.Style.Format = "d";

        }

 

        public override void 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;

            ctl.Value = (DateTime)this.Value;

        }

 

        public override Type EditType

        {

            get

            {

                // Return the type of the editing contol that CalendarCell uses.

                return typeof(CalendarEditingControl);

            }

        }

 

        public override Type ValueType

        {

            get

            {

                // Return the type of the value that CalendarCell contains.

                return typeof(DateTime);

            }

        }

 

        public override object DefaultNewRowValue

        {

            get

            {

                // Use the current date and time as the default value.

                return DateTime.Now;

            }

        }

    }

 

    class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl

    {

        DataGridView dataGridView;

        private bool valueChanged = false;

        int rowIndex;

 

        public CalendarEditingControl()

        {

            this.Format = DateTimePickerFormat.Short;

        }

 

        // Implements the IDataGridViewEditingControl.EditingControlFormattedValue

        // property.

        public object EditingControlFormattedValue

        {

            get

            {

                return this.Value.ToShortDateString();

            }

            set

            {

                String newValue = value as String;

                if (newValue != null)

                {

                    this.Value = DateTime.Parse(newValue);

                }

            }

        }

 

        // Implements the

        // IDataGridViewEditingControl.GetEditingControlFormattedValue method.

        public object GetEditingControlFormattedValue(

            DataGridViewDataErrorContexts context)

        {

            return EditingControlFormattedValue;

        }

 

        // Implements the

        // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.

        public void ApplyCellStyleToEditingControl(

            DataGridViewCellStyle dataGridViewCellStyle)

        {

            this.Font = dataGridViewCellStyle.Font;

            this.CalendarForeColor = dataGridViewCellStyle.ForeColor;

            this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;

        }

 

        // Implements the IDataGridViewEditingControl.EditingControlRowIndex

        // property.

        public int EditingControlRowIndex

        {

            get

            {

                return rowIndex;

            }

            set

            {

                rowIndex = value;

            }

        }

 

        // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey

        // method.

        public bool 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:

                    return true;

                default:

                    return false;

            }

        }

 

        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit

        // method.

        public void PrepareEditingControlForEdit(bool selectAll)

        {

            // No preparation needs to be done.

        }

 

        // Implements the IDataGridViewEditingControl

        // .RepositionEditingControlOnValueChange property.

        public bool RepositionEditingControlOnValueChange

        {

            get

            {

                return false;

            }

        }

 

        // Implements the IDataGridViewEditingControl

        // .EditingControlDataGridView property.

        public DataGridView EditingControlDataGridView

        {

            get

            {

                return dataGridView;

            }

            set

            {

                dataGridView = value;

            }

        }

 

        // Implements the IDataGridViewEditingControl

        // .EditingControlValueChanged property.

        public bool EditingControlValueChanged

        {

            get

            {

                return valueChanged;

            }

            set

            {

                valueChanged = value;

            }

        }

 

        // Implements the IDataGridViewEditingControl

        // .EditingPanelCursor property.

        public Cursor EditingPanelCursor

        {

            get

            {

                return base.Cursor;

            }

        }

 

        protected override void OnValueChanged(EventArgs eventargs)

        {

            // Notify the DataGridView that the contents of the cell

            // have changed.

            valueChanged = true;

            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);

            base.OnValueChanged(eventargs);

        }

    }

}

arrow
arrow
    全站熱搜

    Big Bear 發表在 痞客邦 留言(0) 人氣()