在DataGrid的TextBox中添加一个DateTimePicker控件

szyjp 2009-11-18 10:40:21

如上图,小弟刚学C#,如何在dataGridView中将一列变为DateTimePicker,谢谢!
...全文
1202 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjygy 2011-05-24
  • 打赏
  • 举报
回复
还是高不明白啊
cpf_cn 2010-10-08
  • 打赏
  • 举报
回复
想看看楼主的完整解决方法。
szyjp 2009-11-24
  • 打赏
  • 举报
回复
噢,用4楼的代码搞定了,是我自己的问题,将这个窗口删掉后新建一个窗口就好了,谢谢大家了!
szyjp 2009-11-20
  • 打赏
  • 举报
回复
谢谢,我先试一下看看
bryht 2009-11-20
  • 打赏
  • 举报
回复
用.cs文件拷下来,托到项目中,能直接调用,嗷嗷帅,嘎嘎
bryht 2009-11-20
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CustomDataGridViewColumn
{


/// <summary>
/// 日期选择DataGridViewColumn
/// </summary>
public class DataGridViewCalendarColumn : DataGridViewColumn
{
/// <summary>
/// 初始化
/// </summary>
public DataGridViewCalendarColumn()
: base(new DataGridViewCalendarCell())
{
}

/// <summary>
/// 获取或设置用于创建新单元格的模板。
/// </summary>
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(DataGridViewCalendarCell)))
{
throw new InvalidCastException("Must be a CalendarCell");
}
base.CellTemplate = value;
}
}
}
/// <summary>
/// 日期选择DataGridViewTextBoxCell
/// </summary>
public class DataGridViewCalendarCell : DataGridViewTextBoxCell
{
/// <summary>
/// 初始化
/// </summary>
public DataGridViewCalendarCell()
: base()
{
// Use the short date format.
this.Style.Format = "d";
}

/// <summary>
/// 附加并初始化寄宿的编辑控件。
/// </summary>
/// <param name="rowIndex"></param>
/// <param name="initialFormattedValue"></param>
/// <param name="dataGridViewCellStyle"></param>
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);
DataGridViewCalendarEditingControl ctl =
DataGridView.EditingControl as DataGridViewCalendarEditingControl;
ctl.Value = (DateTime)this.Value;
}

/// <summary>
/// 编辑时的类型
/// </summary>
public override Type EditType
{
get
{
// Return the type of the editing contol that CalendarCell uses.
return typeof(DataGridViewCalendarEditingControl);
}
}

/// <summary>
/// 值类型
/// </summary>
public override Type ValueType
{
get
{
// Return the type of the value that CalendarCell contains.
return typeof(DateTime);
}
}

/// <summary>
/// 默认值
/// </summary>
public override object DefaultNewRowValue
{
get
{
// Use the current date and time as the default value.
return DateTime.Now;
}
}
}

/// <summary>
/// DateTimePicker单元格控件
/// </summary>
public class DataGridViewCalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;

/// <summary>
/// 初始化
/// </summary>
public DataGridViewCalendarEditingControl()
{
this.Format = DateTimePickerFormat.Short;
}


/// <summary>
/// 获取或设置编辑器正在修改的单元格的格式化值。
/// </summary>
public object EditingControlFormattedValue
{
get
{
return this.Value.ToShortDateString();
}
set
{
if (value is String)
{
this.Value = DateTime.Parse((String)value);
}
}
}

/// <summary>
/// 检索单元格的格式化值。
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}

/// <summary>
/// 更改控件的用户界面 (UI),使之与指定单元格样式一致。
/// </summary>
/// <param name="dataGridViewCellStyle"></param>
public void ApplyCellStyleToEditingControl(
DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
}

/// <summary>
/// 获取或设置该承载单元格的父行的索引。
/// </summary>
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}

/// <summary>
/// 确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。
/// </summary>
/// <param name="key"></param>
/// <param name="dataGridViewWantsInputKey"></param>
/// <returns></returns>
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 !dataGridViewWantsInputKey;
}
}

/// <summary>
/// 准备当前选中的单元格以进行编辑。
/// </summary>
/// <param name="selectAll"></param>
public void PrepareEditingControlForEdit(bool selectAll)
{
// No preparation needs to be done.
}

/// <summary>
/// 获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。
/// </summary>
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}

/// <summary>
/// 获取或设置包含单元格的 System.Windows.Forms.DataGridView。
/// </summary>
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}

/// <summary>
/// 获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。
/// </summary>
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}

/// <summary>
/// 获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。
/// </summary>
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}

/// <summary>
/// 重写数据变化方法
/// </summary>
/// <param name="eventargs"></param>
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);
}
}
}

szyjp 2009-11-20
  • 打赏
  • 举报
回复
还是没有搞定啊,大家有没有这样的实列介一下啦!
szyjp 2009-11-20
  • 打赏
  • 举报
回复
if (e.ColumnIndex == 6)
这一句就是设置控件的位置啊,第六列
szyjp 2009-11-20
  • 打赏
  • 举报
回复
上面这段代码太复杂了,我都看不明白,我试了这段代码还是不行噢,怎么办?
szyjp 2009-11-19
  • 打赏
  • 举报
回复
我知道了,将上面的代码加入到窗口加载中,
但是用上面的这段代码生日列不会变成时间控件,代码如下:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
//如果此编辑单元格为第一列的单元格时候.
if (e.ColumnIndex == 6) //你可以改为你想要的列
{
if (dp == null) return;
dp.Bounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);//设置日期控件的大小及位置
dp.Visible = true;//显示日期控件
}
else
{
dp.Visible = false; //隐藏日期控件
}

}
szyjp 2009-11-19
  • 打赏
  • 举报
回复
//向DataGridView控件插入一个日期选择控件
DateTimePicker dp = new DateTimePicker();
dp.CustomFormat = "yyyy-MM-dd";
dp.Format = DateTimePickerFormat.Custom;
dp.Visible=false;
dataGridView1.Controls.Add(dp);
//单元格获得输入焦点时

这一段放在什么地方?
noway8881 2009-11-19
  • 打赏
  • 举报
回复
DataGrid没有DataTime的列嘛?

可以自己实现一个DateTimePickerColumn
hiddkiller 2009-11-19
  • 打赏
  • 举报
回复
//向DataGridView控件插入一个日期选择控件
DateTimePicker dp = new DateTimePicker();
dp.CustomFormat = "yyyy-MM-dd";
dp.Format = DateTimePickerFormat.Custom;
dp.Visible=false;
dataGridView1.Controls.Add(dp);
//单元格获得输入焦点时
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
//如果此编辑单元格为第一列的单元格时候.
if (e.ColumnIndex == 0) //你可以改为你想要的列
{
if (dp == null) return;
dp.Bounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);//设置日期控件的大小及位置
dp.Visible = true;//显示日期控件
}
else
{
dp.Visible = false; //隐藏日期控件
}

}

这段代码的确插入了日期控件. 但是还有点问题,选择之后不会把值设置到对应的单元格.
自己想.
szyjp 2009-11-19
  • 打赏
  • 举报
回复
非常感谢楼上的 人生如梦 ,写得确实很详细,可是我还是看得不太明白,能否加上备注呢?
zl194 2009-11-19
  • 打赏
  • 举报
回复
没有显示,是因为没有设置控件的位置。
zl194 2009-11-19
  • 打赏
  • 举报
回复
给你个详细的例子,肯定能学会。
http://blog.csdn.net/cbq926/archive/2008/11/09/3260445.aspx
zl194 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 szyjp 的回复:]
//向DataGridView控件插入一个日期选择控件
        DateTimePicker dp = new DateTimePicker();
        dp.CustomFormat = "yyyy-MM-dd";
        dp.Format = DateTimePickerFormat.Custom;
        dp.Visible=false;
        dataGridView1.Controls.Add(dp);
        //单元格获得输入焦点时

这一段放在什么地方?
[/Quote]

放在 Form_Load中就可以。
hiddkiller 2009-11-19
  • 打赏
  • 举报
回复
public Frm_user()
{
InitializeComponent();
dp = new DateTimePicker();
}
private DateTimePicker dp;



if (e.ColumnIndex == 6) //你可以改为你想要的列

if (e.ColumnIndex == 5)


szyjp 2009-11-19
  • 打赏
  • 举报
回复
怎么没有人理我呢?现将代码贴出来帮忙看一下吧,谢谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace newbook
{
public partial class Frm_user : Form
{
public Frm_user()
{
InitializeComponent();
}

private static DateTimePicker dp = new DateTimePicker();

private void Frm_user_Load(object sender, EventArgs e)
{
dp.CustomFormat = "yyyy-MM-dd";
dp.Format = DateTimePickerFormat.Custom;
dp.Visible = false;
dataGridView1.Controls.Add(dp);

}

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
//如果此编辑单元格为第一列的单元格时候.
if (e.ColumnIndex == 6) //你可以改为你想要的列
{
if (dp == null) return;
dp.Bounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);//设置日期控件的大小及位置
dp.Visible = true;//显示日期控件
}
else
{
dp.Visible = false; //隐藏日期控件
}

}

}
}


wuyq11 2009-11-18
  • 打赏
  • 举报
回复
DateTimePicker dp = new DateTimePicker();
dp.MinDate=new DateTime(2009, 11, 18);
dp.MaxDate = new DateTime(2010, 11, 18);
dp.CustomFormat = "MMMM dd, yyyy - dddd";
dp.Format = DateTimePickerFormat.Custom;
dp.ShowCheckBox = true;
dp.ShowUpDown = true;
dp.Visible=false;
dp.Name="DateTimePicker";
dataGridView1.Controls.Add(dp);

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
object _DateControl = dataGridView1.Controls["DateTimePicker"];
if (_DateControl == null) return;
DateTimePicker _DateTimePicker = (DateTimePicker)_DateControl;
if (e.ColumnIndex == 0)
{
Rectangle _Rectangle = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
_DateTimePicker.Size = new Size(_Rectangle.Width, _Rectangle.Height);
_DateTimePicker.Location = new Point(_Rectangle.X, _Rectangle.Y);
_DateTimePicker.Visible = true;
}
else
{
_DateTimePicker.Visible = false;
}

}

datagridview
加载更多回复(1)
Visual Basic 6编程技术大全 是非常详细和深入的Vb6学习教程,无论对初学者还是有经验的开发人员,都非常有帮助 第一部分基础篇1 第1章 VB6入门1 1.1 集成开发环境1 1.1.1 运行IDE1 1.1.2 选择工程类型1 1.1.3 IDE窗口2 1.1.4 菜单5 1.1.5 工具栏6 1.1.6 Toolbox7 1.2 第一个VB应用程序9 1.2.1 向窗体添加代码9 1.2.2 设置控件的属性10 1.2.3 为控件命名12 1.2.4 移动及重新调整控件尺寸13 1.2.5 设置Tab顺序13 1.2.6 添加代码14 1.2.7 运行和调试程序15 1.2.8 优化示例程序16 1.2.9 准备、编译、运行18 第2章关于窗体20 2.1 通用属性20 2.1.1 Left、Top、Width和Height属性21 2.1.2 ForeColor和BackColor属性21 2.1.3 Font属性23 2.1.4 Caption和Text属性24 2.1.5 Parent和Container属性25 2.1.6 Enabled和Visible属性25 2.1.7 hWnd属性26 2.1.8 TabStop和Tablndex属性26 2.1.9 MousePointer和Mouselcon属性27 2.1.10Tag属性28 2.1.11其他属性28 2.2 通用方法29 2.2.1 Move方法29 2.2.2 Refresh方法30 2.2.3 SetFocus方法30 2.2.4 ZOrder方法31 2.3 通用事件31 2.3.1 Click和DblClick事件31 2.3.2 Change事件32 2.3.3 GotFocus和LostFocus事件33 2.3.4 KeyPress、KeyDown和KeyUp事件33 2.3.5 MouseDown、MouseUp和 MouseMove事件35 2.4 Form对象37 2.4.1基本的Form属性37 2.4.2微调窗体的性能38 2.4.3 Form的生存期39 2.4.4 Controls集合43 2.4.5 Screen对象44 2.4.6打印文本45 2.4.7图形方法48 2.4.8 DrawMode属性51 2.4.9 ScaleMode属性54 2.4.10调色板支持56 第3章内部控件58 3.1TextBox控件58 3.1.1 运行时属性59 3.1.2捕获键盘活动60 3.1.3数字的校验例程61 3.1.4 CausesValidation属性和Validate事件63 3.1.5自动跳格字段65 3.1.6格式化文本65 3.1.7多行TextBox控件69 3.2 Label和Frame控件70 3.2.1 Label控件70 3.2.2 Frame控件71 3.3 CommandButton、CheckBox和 OptionButton控件71 3.3.1 CommandButton控件72 3.3.2 CheckBox控件72 3.3.3 OptionButton控件73 3.3.4使用图形化控件73 3.4 ListBox和ComboBox控件74 3.4.1 ListBox控件74 3.4.2 ComboBox控件81 3.5 PictureBox和Image控件83 3.5.1 PictureBox控件83 3.5.2 Image控件86 3.6滚动条控件86 3.7 DriveListBox、DirListBox和FileListBox控件89 3.8其他控件91 3.8.1Timer控件91 3.8.2 Line控件92 3.8.3 Shape控件92 3.8.4 OLE控件92 3.9菜单93 3.9.1运行时访问菜单94 3.9.2弹出式菜单95 3.10控件数组96 3.11共享事件过程97 3.11.1运行时创建控件97 3.11.2迭代控件数组的项目98 3.11.3菜单项数组98 第4章变量与过程100 4.1变量的作用域和生存期100 4.1.1全局变量100 4.1.2模块级的变量101 4.1.3动态局部变量102 4.1.4静态局部变量102 4.2内置数据类型概述103 4.2.1整型数据类型103 4.2.2长整型数据类型104 4.2.3布尔数据类型104 4.2.4字节数据类型104 4.2.5单精度数据类型104 4.2.6双精度数据类型105 4.2.7字符串数据类型105 4.2.8货币数据类型106 4.2.9日期数据类型106 4.2.10对象数据类型106 4.2.11变量数据类型107
Visual Basic 6编程技术大全 是非常详细和深入的Vb6学习教程,无论对初学者还是有经验的开发人员,都非常有帮助 第一部分基础篇1 第1章 VB6入门1 1.1 集成开发环境1 1.1.1 运行IDE1 1.1.2 选择工程类型1 1.1.3 IDE窗口2 1.1.4 菜单5 1.1.5 工具栏6 1.1.6 Toolbox7 1.2 第一个VB应用程序9 1.2.1 向窗体添加代码9 1.2.2 设置控件的属性10 1.2.3 为控件命名12 1.2.4 移动及重新调整控件尺寸13 1.2.5 设置Tab顺序13 1.2.6 添加代码14 1.2.7 运行和调试程序15 1.2.8 优化示例程序16 1.2.9 准备、编译、运行18 第2章关于窗体20 2.1 通用属性20 2.1.1 Left、Top、Width和Height属性21 2.1.2 ForeColor和BackColor属性21 2.1.3 Font属性23 2.1.4 Caption和Text属性24 2.1.5 Parent和Container属性25 2.1.6 Enabled和Visible属性25 2.1.7 hWnd属性26 2.1.8 TabStop和Tablndex属性26 2.1.9 MousePointer和Mouselcon属性27 2.1.10Tag属性28 2.1.11其他属性28 2.2 通用方法29 2.2.1 Move方法29 2.2.2 Refresh方法30 2.2.3 SetFocus方法30 2.2.4 ZOrder方法31 2.3 通用事件31 2.3.1 Click和DblClick事件31 2.3.2 Change事件32 2.3.3 GotFocus和LostFocus事件33 2.3.4 KeyPress、KeyDown和KeyUp事件33 2.3.5 MouseDown、MouseUp和 MouseMove事件35 2.4 Form对象37 2.4.1基本的Form属性37 2.4.2微调窗体的性能38 2.4.3 Form的生存期39 2.4.4 Controls集合43 2.4.5 Screen对象44 2.4.6打印文本45 2.4.7图形方法48 2.4.8 DrawMode属性51 2.4.9 ScaleMode属性54 2.4.10调色板支持56 第3章内部控件58 3.1TextBox控件58 3.1.1 运行时属性59 3.1.2捕获键盘活动60 3.1.3数字的校验例程61 3.1.4 CausesValidation属性和Validate事件63 3.1.5自动跳格字段65 3.1.6格式化文本65 3.1.7多行TextBox控件69 3.2 Label和Frame控件70 3.2.1 Label控件70 3.2.2 Frame控件71 3.3 CommandButton、CheckBox和 OptionButton控件71 3.3.1 CommandButton控件72 3.3.2 CheckBox控件72 3.3.3 OptionButton控件73 3.3.4使用图形化控件73 3.4 ListBox和ComboBox控件74 3.4.1 ListBox控件74 3.4.2 ComboBox控件81 3.5 PictureBox和Image控件83 3.5.1 PictureBox控件83 3.5.2 Image控件86 3.6滚动条控件86 3.7 DriveListBox、DirListBox和FileListBox控件89 3.8其他控件91 3.8.1Timer控件91 3.8.2 Line控件92 3.8.3 Shape控件92 3.8.4 OLE控件92 3.9菜单93 3.9.1运行时访问菜单94 3.9.2弹出式菜单95 3.10控件数组96 3.11共享事件过程97 3.11.1运行时创建控件97 3.11.2迭代控件数组的项目98 3.11.3菜单项数组98 第4章变量与过程100 4.1变量的作用域和生存期100 4.1.1全局变量100 4.1.2模块级的变量101 4.1.3动态局部变量102 4.1.4静态局部变量102 4.2内置数据类型概述103 4.2.1整型数据类型103 4.2.2长整型数据类型104 4.2.3布尔数据类型104 4.2.4字节数据类型104 4.2.5单精度数据类型104 4.2.6双精度数据类型105 4.2.7字符串数据类型105 4.2.8货币数据类型106 4.2.9日期数据类型106 4.2.10对象数据类型106 4.2.11变量数据类型107

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧