Si pudiera adjuntar una imagen de como queda el DataGridView con esta columna para editar tipos DateTime...
Esto es mas que solo mostrar una fecha, te presenta un DateTimePicker en la celda cuando estas editando.
Compañero creo que esto te servira:
namespace Post
{
using System;
using System.Drawing;
using System.Windows.Forms;
public class DataGridViewDatePickerEditingControl : DateTimePicker, IDataGridViewEditingControl
{
#region Fields
private DataGridView dataGridView;
private int rowIndex;
private bool valueChanged;
private bool repositionOnValueChange;
#endregion
#region .ctor()
public DataGridViewDatePickerEditingControl()
: base()
{
base.Checked = false;
base.ShowCheckBox = true;
base.CustomFormat = "dd/MM/yyyy";
base.Format = DateTimePickerFormat.Custom;
}
#endregion
#region IDataGridViewEditingControl Members
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
if (dataGridViewCellStyle.BackColor.A
{
Color color = Color.FromArgb(255, dataGridViewCellStyle.BackColor);
this.BackColor = color;
this.dataGridView.EditingPanel.BackColor = color;
}
else
{
this.BackColor = dataGridViewCellStyle.BackColor;
}
this.ForeColor = dataGridViewCellStyle.ForeColor;
repositionOnValueChange = (dataGridViewCellStyle.WrapMode == DataGridViewTriState.True);// && (dataGridViewCellStyle.Alignment & anytop));
}
public DataGridView EditingControlDataGridView
{
get { return dataGridView; }
set { dataGridView = value; }
}
public object EditingControlFormattedValue
{
get
{
throw new Exception("The method or operation is not implemented.");
}
set { this.Value = (DateTime)value; }
}
public int EditingControlRowIndex
{
get { return rowIndex; }
set { rowIndex = value; }
}
public bool EditingControlValueChanged
{
get { return valueChanged; }
set { valueChanged = value; }
}
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
return true;
}
public Cursor EditingPanelCursor
{
get { return Cursors.Default; }
}
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.Value;
}
public void PrepareEditingControlForEdit(bool selectAll)
{
//
}
public bool RepositionEditingControlOnValueChange
{
get { return repositionOnValueChange; }
}
#endregion
}
public class DataGridViewDatePickerCell : DataGridViewCell
{
#region Fields
private byte flagsState;
#endregion
#region Properties
public override Type EditType
{
get { return typeof(DataGridViewDatePickerEditingControl); }
}
public override Type FormattedValueType
{
get { return typeof(string); }
}
#endregion
#region .ctor()
public DataGridViewDatePickerCell()
: base()
{
}
#endregion
#region Privates
private Rectangle GetAdjustedEditingControlBounds(Rectangle editingControlBounds, DataGridViewCellStyle cellStyle)
{
int height;
DateTimePicker picker = base.DataGridView.EditingControl as DateTimePicker;
int maxWidth = editingControlBounds.Width;
if (picker != null)
{
switch (cellStyle.Alignment)
{
case DataGridViewContentAlignment.TopLeft:
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.BottomLeft:
editingControlBounds.X += 3;
editingControlBounds.Width = Math.Max(0, (editingControlBounds.Width - 3) - 1);
break;
case DataGridViewContentAlignment.TopCenter:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.BottomCenter:
editingControlBounds.X++;
editingControlBounds.Width = Math.Max(0, editingControlBounds.Width - 3);
break;
case DataGridViewContentAlignment.TopRight:
case DataGridViewContentAlignment.BottomRight:
case DataGridViewContentAlignment.MiddleRight:
editingControlBounds.X++;
editingControlBounds.Width = Math.Max(0, (editingControlBounds.Width - 4) - 1);
break;
}
switch (cellStyle.Alignment)
{
case DataGridViewContentAlignment.TopLeft:
case DataGridViewContentAlignment.TopCenter:
case DataGridViewContentAlignment.TopRight:
editingControlBounds.Y += 2;
editingControlBounds.Height = Math.Max(0, editingControlBounds.Height - 2);
break;
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.MiddleCenter:
case DataGridViewContentAlignment.MiddleRight:
editingControlBounds.Height++;
break;
case DataGridViewContentAlignment.BottomCenter:
case DataGridViewContentAlignment.BottomRight:
case DataGridViewContentAlignment.BottomLeft:
editingControlBounds.Height = Math.Max(0, editingControlBounds.Height - 1);
break;
}
if (cellStyle.WrapMode == DataGridViewTriState.False)
{
height = picker.PreferredSize.Height;
}
else
{
string editingControlFormattedValue = (string)((IDataGridViewEditingControl)picker).GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
if (string.IsNullOrEmpty(editingControlFormattedValue))
{
editingControlFormattedValue = " ";
}
TextFormatFlags flags = ComputeTextFormatFlagsForCellStyleAlignment(cellStyle.Alignment, cellStyle.WrapMode);
height = DataGridViewCell.MeasureTextHeight(base.DataGridView.CreateGraphics(), editingControlFormattedValue, cellStyle.Font, maxWidth, flags);
}
if (height
{
DataGridViewContentAlignment alignment = cellStyle.Alignment;
if (alignment
{
switch (alignment)
{
case DataGridViewContentAlignment.TopLeft:
case DataGridViewContentAlignment.TopCenter:
case (DataGridViewContentAlignment.TopCenter | DataGridViewContentAlignment.TopLeft):
case DataGridViewContentAlignment.TopRight:
return editingControlBounds;
case DataGridViewContentAlignment.MiddleLeft:
case DataGridViewContentAlignment.MiddleCenter:
goto Label_0310;
}
return editingControlBounds;
}
if (alignment
{
switch (alignment)
{
case DataGridViewContentAlignment.MiddleRight:
goto Label_0310;
case DataGridViewContentAlignment.BottomLeft:
goto Label_032B;
}
return editingControlBounds;
}
switch (alignment)
{
case DataGridViewContentAlignment.BottomCenter:
case DataGridViewContentAlignment.BottomRight:
goto Label_032B;
}
}
}
return editingControlBounds;
Label_0310:
editingControlBounds.Y += (editingControlBounds.Height - height) / 2;
return editingControlBounds;
Label_032B:
editingControlBounds.Y += editingControlBounds.Height - height;
return editingControlBounds;
}
private Rectangle PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
DataGridViewElementStates cellState, object formattedValue, string errorText,
DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts, bool computeContentBounds, bool computeErrorIconBounds, bool paint)
{
SolidBrush cachedBrush;
Rectangle empty = Rectangle.Empty;
if (paint)
{
this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
}
Rectangle rectangle2 = this.BorderWidths(advancedBorderStyle);
Rectangle rect = cellBounds;
rect.Offset(rectangle2.X, rectangle2.Y);
rect.Width -= rectangle2.Right;
rect.Height -= rectangle2.Bottom;
Point currentCellAddress = base.DataGridView.CurrentCellAddress;
bool flag = (currentCellAddress.X == base.ColumnIndex) && (currentCellAddress.Y == rowIndex);
bool flag2 = flag && (base.DataGridView.EditingControl != null);
bool flag3 = (cellState & DataGridViewElementStates.Selected) != DataGridViewElementStates.None;
if (flag3 && !flag2)
cachedBrush = new SolidBrush(cellStyle.SelectionBackColor);
else
cachedBrush = new SolidBrush(cellStyle.BackColor);
if ((paint && ((cachedBrush.Color.A == 255) && (rect.Width > 0))) && (rect.Height > 0))
graphics.FillRectangle(cachedBrush, rect);
if (cellStyle.Padding != Padding.Empty)
{
rect.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top);
rect.Width -= cellStyle.Padding.Horizontal;
rect.Height -= cellStyle.Padding.Vertical;
}
if (((paint && flag) && !flag2) && ((base.DataGridView.Focused) && ((rect.Width > 0) && (rect.Height > 0))))
{
ControlPaint.DrawFocusRectangle(graphics, rect, Color.Empty, cachedBrush.Color);
}
Rectangle cellValueBounds = rect;
string text = (formattedValue is DateTime) ? ((DateTime)formattedValue).ToString("dd/MM/yyyy") : (string)formattedValue; //!= null && formattedValue is DateTime) ? ((DateTime)formattedValue).ToString("dd/MM/yyyy") : string.Empty;
if ((text != null) && ((paint && !flag2) || computeContentBounds))
{
int y = (cellStyle.WrapMode == DataGridViewTriState.True) ? 1 : 2;
rect.Offset(0, y);
rect.Width = rect.Width;
rect.Height -= y + 1;
if ((rect.Width > 0) && (rect.Height > 0))
{
TextFormatFlags flags = ComputeTextFormatFlagsForCellStyleAlignment(cellStyle.Alignment, cellStyle.WrapMode);
if (paint)
{
if ((flags & TextFormatFlags.SingleLine) != TextFormatFlags.GlyphOverhangPadding)
flags |= TextFormatFlags.EndEllipsis;
TextRenderer.DrawText(graphics, text, cellStyle.Font, rect, flag3 ? cellStyle.SelectionForeColor : cellStyle.ForeColor, flags);
}
else
empty = GetTextBounds(rect, text, flags, cellStyle);
}
}
return empty;
}
internal static TextFormatFlags ComputeTextFormatFlagsForCellStyleAlignment(DataGridViewContentAlignment alignment, DataGridViewTriState wrapMode)
{
TextFormatFlags glyphOverhangPadding;
switch (alignment)
{
case DataGridViewContentAlignment.TopLeft:
glyphOverhangPadding = TextFormatFlags.GlyphOverhangPadding;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
case DataGridViewContentAlignment.TopCenter:
glyphOverhangPadding = TextFormatFlags.HorizontalCenter;
break;
case DataGridViewContentAlignment.TopRight:
glyphOverhangPadding = TextFormatFlags.GlyphOverhangPadding;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
case DataGridViewContentAlignment.MiddleLeft:
glyphOverhangPadding = TextFormatFlags.VerticalCenter;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
case DataGridViewContentAlignment.MiddleCenter:
glyphOverhangPadding = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter;
break;
case DataGridViewContentAlignment.BottomCenter:
glyphOverhangPadding = TextFormatFlags.Bottom | TextFormatFlags.HorizontalCenter;
break;
case DataGridViewContentAlignment.BottomRight:
glyphOverhangPadding = TextFormatFlags.Bottom;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
case DataGridViewContentAlignment.MiddleRight:
glyphOverhangPadding = TextFormatFlags.VerticalCenter;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
case DataGridViewContentAlignment.BottomLeft:
glyphOverhangPadding = TextFormatFlags.Bottom;
glyphOverhangPadding |= TextFormatFlags.Right;
break;
default:
glyphOverhangPadding = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter;
break;
}
if (wrapMode == DataGridViewTriState.False)
{
glyphOverhangPadding |= TextFormatFlags.SingleLine;
}
else
{
glyphOverhangPadding |= TextFormatFlags.WordBreak;
}
glyphOverhangPadding |= TextFormatFlags.NoPrefix;
glyphOverhangPadding |= TextFormatFlags.PreserveGraphicsClipping;
return glyphOverhangPadding;
}
internal static Rectangle GetTextBounds(Rectangle cellBounds, string text, TextFormatFlags flags, DataGridViewCellStyle cellStyle)
{
return GetTextBounds(cellBounds, text, flags, cellStyle, cellStyle.Font);
}
internal static Rectangle GetTextBounds(Rectangle cellBounds, string text, TextFormatFlags flags, DataGridViewCellStyle cellStyle, Font font)
{
if (((flags & TextFormatFlags.SingleLine) != TextFormatFlags.GlyphOverhangPadding) && (TextRenderer.MeasureText(text, font, new Size(2147483647, 2147483647), flags).Width > cellBounds.Width))
{
flags |= TextFormatFlags.EndEllipsis;
}
Size proposedSize = new Size(cellBounds.Width, cellBounds.Height);
Size size = TextRenderer.MeasureText(text, font, proposedSize, flags);
if (size.Width > proposedSize.Width)
{
size.Width = proposedSize.Width;
}
if (size.Height > proposedSize.Height)
{
size.Height = proposedSize.Height;
}
if (size == proposedSize)
{
return cellBounds;
}
return new Rectangle(GetTextLocation(cellBounds, size, flags, cellStyle), size);
}
internal static Point GetTextLocation(Rectangle cellBounds, Size sizeText, TextFormatFlags flags, DataGridViewCellStyle cellStyle)
{
Point point = new Point(0, 0);
DataGridViewContentAlignment middleLeft = cellStyle.Alignment;
if ((flags & TextFormatFlags.RightToLeft) != TextFormatFlags.GlyphOverhangPadding)
{
switch (middleLeft)
{
case DataGridViewContentAlignment.MiddleRight:
middleLeft = DataGridViewContentAlignment.MiddleLeft;
break;
case DataGridViewContentAlignment.BottomLeft:
middleLeft = DataGridViewContentAlignment.BottomRight;
break;
case DataGridViewContentAlignment.BottomRight:
middleLeft = DataGridViewContentAlignment.BottomLeft;
break;
case DataGridViewContentAlignment.TopLeft:
middleLeft = DataGridViewContentAlignment.TopRight;
break;
case DataGridViewContentAlignment.TopRight:
middleLeft = DataGridViewContentAlignment.TopLeft;
break;
case DataGridViewContentAlignment.MiddleLeft:
middleLeft = DataGridViewContentAlignment.MiddleRight;
break;
}
}
DataGridViewContentAlignment alignment3 = middleLeft;
if (alignment3
{
switch (alignment3)
{
case DataGridViewContentAlignment.TopLeft:
point.X = cellBounds.X;
point.Y = cellBounds.Y;
return point;
case DataGridViewContentAlignment.TopCenter:
point.X = cellBounds.X + ((cellBounds.Width - sizeText.Width) / 2);
point.Y = cellBounds.Y;
return point;
case (DataGridViewContentAlignment.TopCenter | DataGridViewContentAlignment.TopLeft):
return point;
case DataGridViewContentAlignment.TopRight:
point.X = cellBounds.Right - sizeText.Width;
point.Y = cellBounds.Y;
return point;
case DataGridViewContentAlignment.MiddleLeft:
point.X = cellBounds.X;
point.Y = cellBounds.Y + ((cellBounds.Height - sizeText.Height) / 2);
return point;
case DataGridViewContentAlignment.MiddleCenter:
point.X = cellBounds.X + ((cellBounds.Width - sizeText.Width) / 2);
point.Y = cellBounds.Y + ((cellBounds.Height - sizeText.Height) / 2);
return point;
}
return point;
}
if (alignment3
{
switch (alignment3)
{
case DataGridViewContentAlignment.MiddleRight:
point.X = cellBounds.Right - sizeText.Width;
point.Y = cellBounds.Y + ((cellBounds.Height - sizeText.Height) / 2);
return point;
case DataGridViewContentAlignment.BottomLeft:
point.X = cellBounds.X;
point.Y = cellBounds.Bottom - sizeText.Height;
return point;
}
&nb