请教DataGridView如何在单击单元格的时候显示DatetimePicker,没有源码给点提示或参考资料也行

哈皮玩 2008-07-11 12:38:38
当单击DataGridView某个单元格时,将这个单元格重绘成DateTimePicker(或其它控件),不知道哪位能帮忙给点意见?
...全文
436 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangtc0725 2010-10-09
  • 打赏
  • 举报
回复
很好,学习
BrightFire 2010-08-10
  • 打赏
  • 举报
回复
我有个问题,关于2楼和6楼的方法,datetimepicker的高度可以这样调整吗?为啥我怎么调都会返回到默认的高度?要设哪个属性吗?
shark08 2008-07-16
  • 打赏
  • 举报
回复
可以去找Devexpress控件包,能轻松实现!!!
哈皮玩 2008-07-14
  • 打赏
  • 举报
回复
结贴,做个厚道的人!
哈皮玩 2008-07-11
  • 打赏
  • 举报
回复
多谢各位!
smntbk的方法也可以做到,但是控件的大小和位置控制方面不如小三的方法。
还有一个问题,就是如何将值写入单元格以及操作完成后让DateTimePicker对象“消失”?并且,这种“障眼法”不能解决用户在DataGridView数据源绑定后调整cell的大小的时候,dtp并不能自动填满单元格(亦即“露馅”了)。

其实我是想实现特定的单元格(假使有一个标识可以让程序定位该单元格,但是不知道它具体在什么位置)单击时,用DateTimePicker或者其它控件直接重绘在该单元格内,这样由于它属于DataGridView内的一个元素,应该会继承DataGridView的一些属性——msdn上面说要派生至Control并实现IDataGridViewEditingControl接口。

其实也考虑过直接定义DateTimePicker列或者ComboBox列,但这样整列都是,不符合我的要求了。

再描述一下我的要求:编辑(单击)单元格时,用其它控件重绘在该单元格内,并将编辑后的值写入该单元格(单元格样式恢复初始状态),要求此控件自动继承DataGridView的相关属性,这样就不用考虑用户拖动单元格大小以及滚动DGV带来的影响了。


多谢各位!再接再厉!
哈皮玩 2008-07-11
  • 打赏
  • 举报
回复
谢谢大家,让我试一下。
smntbk 2008-07-11
  • 打赏
  • 举报
回复
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
int width = this.dataGridView1.Columns[e.ColumnIndex].Width;
int height = this.dataGridView1.Rows[e.RowIndex].Height;
DateTimePicker dt = new DateTimePicker();
dt.Location = new Point(this.dataGridView1.RowHeadersWidth + width * e.ColumnIndex, this.dataGridView1.ColumnHeadersHeight + height * e.RowIndex);
dt.Size = new Size(width, height);
this.dataGridView1.Controls.Add(dt);
}
GhostAdai 2008-07-11
  • 打赏
  • 举报
回复
直接做个模板列,添加DateTimerPicker控件就行了,用这个方法可以使这一列的单元格变成任意样式。
wzuomin 2008-07-11
  • 打赏
  • 举报
回复
这个帖子有点类似
只不过是ComboBox控件而非DateTimePicker而已。
royal1 2008-07-11
  • 打赏
  • 举报
回复
对了,在滚动DataGridView时再加上

private void grdDetail_Scroll(object sender, ScrollEventArgs e)
{
dtpLapseDate.Visible = false;
}

这样会不会错位。
royal1 2008-07-11
  • 打赏
  • 举报
回复
拖放一个DateTimePicker(dtpLapseDate)到界面上,其Visible=false;

在单击DataGridView某个单元格时,触发如下:
private void grdDetail_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (grdDetail.Columns[e.ColumnIndex].DataPropertyName == "LapseDate")
{
Rectangle cellrect = grdDetail.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
dtpLapseDate.Height = cellrect.Height;
dtpLapseDate.Width = cellrect.Width;
dtpLapseDate.Top = cellrect.Top + grdDetail.Top;
dtpLapseDate.Left = grdDetail.Left + cellrect.Left;
dtpLapseDate.Visible = true;
dtpLapseDate.BringToFront();
dtpLapseDate.Value = dtpLapseDate.Value.Date;
}
else
{
dtpLapseDate.Visible = false;
}
}
tfrtfr 2008-07-11
  • 打赏
  • 举报
回复
把那一列做成模板列,放DateTimePicker控件就可以了

111,129

社区成员

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

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

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