20.3 使用技巧9
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的
20.3.13 DataGridView使用日期选择控件
有时为了输入方便或者固定日期格式,可以考虑点击DataGridView中某个单元格时出现日期选择控件,避免用户手动输入和格式不一的麻烦。
【例 20A.2】【项目:code20A-002】单元格点击使用日期选择控件。
DateTimePicker dtp;
//当前点击的行
int rowindex;
private void Form1_Load(object sender, EventArgs e)
{
dtp = new DateTimePicker();
dtp.Visible = false;
dgv.Controls.Add(dtp);
//当日期选择控件下拉日历被关闭并消失时调用 dtpCloseUp 方法
dtp.CloseUp += dtpCloseUp;
//当日期选择控件失去焦点时调用 dtpLostFocus 方法
dtp.LostFocus += dtpLostFocus;
}
private void dtpCloseUp(object sender, EventArgs e)
{
//设置日期选择控件不可见
dtp.Visible = false;
//再次判断选中的单元格是否只有一个
if (dgv.SelectedCells.Count > 1)
return;
//再次判断选中的单元格是否在需要设置日期的列
if (dgv.SelectedCells[0].ColumnIndex != 2)
return;
//设置单元格文本为选中的日期
dgv[2, rowindex].Value = dtp.Text;
}
private void dtpLostFocus(object sender, EventArgs e)
{
dtp.Visible = false;
dgv[2, rowindex].Value = dtp.Text;
}
private void dgv_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if (rowindex < 0)
return;
//如果对应列需要设置日期
if (e.ColumnIndex == 2)
{
//由于已经固定是第2列,所以不再需要下列语句
//columnindex = e.ColumnIndex
//获得当前点击的行
rowindex = e.RowIndex;
string cellvalue = (string)dgv[e.ColumnIndex, e.RowIndex].Value;
if (cellvalue == "" || cellvalue==null)
cellvalue = DateTime.Now.ToString();
//当前点击的单元格的位置和大小
Rectangle rect = dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
//设置日期选择控件的位置和大小
dtp.Top = rect.Top;
dtp.Left = rect.Left;
dtp.Width = rect.Width;
dtp.Height = rect.Height;
dgv.Controls.Add(dtp);
dtp.Value = DateTime.Parse(cellvalue);
dtp.Visible = true;
//日期选择控件设置焦点
dtp.Focus();
}
}
运行结果如下图所示:
图20A-2 DataGridView单元格使用日期选择控件
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看C#教程 目录