如题.
日期控件弹出选择框再收回后. 怎么知道用户是否有选择?其中有个问题. 当用户选择了打开选择框之前的日期,这个时候怎么知道用户有选择.
日期控件弹出选择框再收回后. 怎么知道用户是否有选择?其中有个问题. 当用户选择了打开选择框之前的日期,这个时候怎么知道用户有选择.
解决方案 »
- 关于C#2010编数据库界面的小小问题
- MemoryStream stream = new MemoryStream(b, true);
- 求Excel 中 slope函数的算法
- 在非Web程序中用什么缓存?
- C#发送邮件
- GridView 和textbox的问题
- 各位大虾帮帮忙看看好么?
- 为什么我的VS2005的智能菜单里只有三个命令!
- c#里isFirst什么意思???
- 如何实现拉框放大的功能,画一个框,将其中的数据图象放大?
- 今天的一个面试题没做出来,还是个上机题,真郁闷啊,C# 如何对汉字按字典顺序排序??在线等
- Windows Mobile “will be dead by 2011″
winform就是valuechange(object sender, EventArgs e)事件里写了。。
private void dateTimePicker1_Enter(object sender, EventArgs e)
{
dt = dateTimePicker1.Value;
}private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if (dateTimePicker1.Value < dt)
{
MessageBox.Show("以前的日期");
}
dt = dateTimePicker1.Value; // 根据情况可以不改
}
举个例子 现在控件显示 2009年11月16日.然后你再选择 2009年11月16日. Value是没有变的 所以ValueChanged 事件是不会触发的. 但是在这个时候我需要 在用户选择的2009年11月16日 时间上补上系统当前的小时分秒. 还有如果用户只是打开选择框后却移开焦点 使选择框收回那么实际上这个时候是没有选择的,此时我不能填补小时分秒.
(我最要是解决这个问题.)To: 三楼.
恕我愚昧, SelectionChanged 事件我在dateTimePicker控件里没找到.
我感觉不同,用这个控件的目的是要结果,而不是中间过程按了几个键。你再想想,7楼的思路已经解决了这个问题了。(1)用户进来前的原始值:在Enter事件保存起来了。
(2)改变日期值的方法:可以选择、可以直接输入,都会影响一个事件ValueChanged。
(3)在这个事件中,可以处理:
a.新值不符合要求时,要求重新选择。
b.新值不符合要求时,自动恢复原值。
c. ...
如果从选择上考虑就走远路了,那还得考虑按键事件。
你试试这个能解决不?
以下是设置一个dateTimePicker实例 初始值是2009-11-15.
好了,运行后我要在用户有选择或者有键盘改变日期后, 用当前系统的时分秒替换掉value的时分秒.键盘改变日期都会触发valueChanged事件.这倒是容易解决.关键问题是 用户点击选择框显示出来之后.选择了2009-11-15 那怎么处理?
或者点击选择框显示出来之后,根本就没有去选择,而是使dateTimePicker控件失去焦点使之收回选择框呢?我要在第一种情况下替换时分秒,第二种却不做任何处理,现在问题就是这两种情况无法区分. public Form18()
{
InitializeComponent();
dateTimePicker1.Enter+=new EventHandler(dateTimePicker1_Enter);
dateTimePicker1.ValueChanged+=new EventHandler(dateTimePicker1_ValueChanged);
dateTimePicker1.Value = DateTime.Parse("2009-11-15");
}
DateTime dt;
private void dateTimePicker1_Enter(object sender, EventArgs e)
{
dt = dateTimePicker1.Value;
} private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
if (dateTimePicker1.Value < dt)
{
MessageBox.Show("以前的日期");
}
dt = dateTimePicker1.Value; // 根据情况可以不改
}
谢谢了.
给吧 看看嘛. 这个才我现在出问题的.
可以选择null的 日期选择控件
[ToolboxBitmap(typeof(System.Windows.Forms.DateTimePicker))]
public partial class DateTimeControl : DateTimePicker
{
DateTimePickerFormat _format;
string _customFormat;
bool SetValue = false;//表示当前是否是系统在改变Value属性
/// <summary>
/// 获取或设置分配给控件的日期/时间值
/// </summary>
public new DateTime? Value
{
get
{
if ((base.CustomFormat == null || base.CustomFormat.Trim() == "") && base.Format == DateTimePickerFormat.Custom)
return null;
else
return base.Value;
}
set
{
if (value == null)
{
SetValueNullToFormat();
}
else
{
FurbishFormat();
SetValue = true;
base.Value = (DateTime)value;
}
}
}
/// <summary>
/// 格式掩码类型
/// </summary>
public new DateTimePickerFormat Format
{
get
{
return base.Format;
}
set
{
base.Format = value;
_format = base.Format;
}
}
/// <summary>
/// 自定义格式
/// </summary>
public new string CustomFormat
{
get
{
return base.CustomFormat;
}
set
{
base.CustomFormat = value;
_customFormat = base.CustomFormat;
}
}
/// <summary>
/// 构造方法
/// </summary>
public DateTimeControl()
{
_format = base.Format;
_customFormat = base.CustomFormat;
} protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete)
{
Value = null;
}
base.OnKeyUp(e);
}
protected override void OnValueChanged(EventArgs eventargs)
{
base.OnValueChanged(eventargs);
if (!SetValue)//如果当前是系统在改变Value属性,将不执行以下操作
{
DateTime dt = DateTime.Now;
DateTime dt2 = new DateTime(base.Value.Year, base.Value.Month, base.Value.Day, dt.Hour, dt.Minute, dt.Second);
SetValue = true;//设置当前是系统在改变Value属性.
base.Value = dt2;
SetValue = false;//设置系统改变Value属性的过程已经结束.
}
}
/// <summary>
///
/// </summary>
/// <param name="eventargs"></param>
protected override void OnCloseUp(EventArgs eventargs)
{
FurbishFormat();
base.OnCloseUp(eventargs);
}
/// <summary>
/// 设置值为空时的格式
/// </summary>
private void SetValueNullToFormat()
{
if (Value == null)
return;
SetValue = true;//设置当前是系统在改变Value属性.
_format = base.Format;
_customFormat = base.CustomFormat;
base.Format = DateTimePickerFormat.Custom;
base.CustomFormat = " ";
}
/// <summary>
/// 恢复格式
/// </summary>
private void FurbishFormat()
{
base.Format = _format;
base.CustomFormat = _customFormat;
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication154
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm:ss";
dateTimePicker1.Leave += new EventHandler(dateTimePicker1_Leave);
} void dateTimePicker1_Leave(object sender, EventArgs e)
{
dateTimePicker1.Value = DateTime.Parse(dateTimePicker1.Value.Date.ToString("yyyy-MM-dd ")
+ DateTime.Now.ToString("HH:mm:ss"));
}
}
}
随便设置一个格式(CustomFormat属性) yyyy-MM-dd先用键盘删除当前显示的值.好了现在Value为空.在这种情况下.你试试我说的那两种操作. 打开选择框后选择 旧值 以及不选择.
public partial class DateTimeControl : DateTimePicker
{
bool isChanged; // 新加 在选择窗口内是否选择了其他值
DateTimePickerFormat _format;
string _customFormat;
bool SetValue = false;//表示当前是否是系统在改变Value属性
/// <summary>
/// 获取或设置分配给控件的日期/时间值
/// </summary>
public new DateTime ? Value
{
get
{
if ((base.CustomFormat == null || base.CustomFormat.Trim() == "") && base.Format == DateTimePickerFormat.Custom)
return null;
else return base.Value;
}
set
{
if (value == null) SetNullValueFormat();
else
{
SetDefaultFormat();
SetValue = true;
base.Value = (DateTime)value;
}
}
}
/// <summary>
/// 格式掩码类型
/// </summary>
public new DateTimePickerFormat Format
{
get
{
return base.Format;
}
set
{
base.Format = value;
_format = base.Format;
}
}
/// <summary>
/// 自定义格式
/// </summary>
public new string CustomFormat
{
get
{
return base.CustomFormat;
}
set
{
base.CustomFormat = value;
_customFormat = base.CustomFormat;
}
}
/// <summary>
/// 构造方法
/// </summary>
public DateTimeControl()
{
_format = base.Format;
_customFormat = base.CustomFormat;
} protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete)
{
Value = null;
base.OnKeyUp(e);
SetNullValueFormat();
}
else
{
base.OnKeyUp(e);
} }
protected override void OnValueChanged(EventArgs eventargs)
{
base.OnValueChanged(eventargs);
if (!SetValue)//如果当前是系统在改变Value属性,将不执行以下操作
{
DateTime dt = DateTime.Now;
DateTime dt2 = new DateTime(base.Value.Year, base.Value.Month, base.Value.Day, dt.Hour, dt.Minute, dt.Second);
SetValue = true;//设置当前是系统在改变Value属性.
base.Value = dt2;
SetValue = false;//设置系统改变Value属性的过程已经结束.
}
isChanged = true;
}
protected override void OnDropDown(EventArgs eventargs)
{
isChanged = false;
} /// <summary>
///
/// </summary>
/// <param name="eventargs"></param>
protected override void OnCloseUp(EventArgs eventargs)
{
base.OnCloseUp(eventargs);
if (isChanged) SetDefaultFormat();
}
/// <summary>
/// 设置空值格式
/// </summary>
private void SetNullValueFormat()
{
if (Value == null) return;
SetValue = true; //设置当前是系统在改变Value属性.
_format = base.Format;
_customFormat = base.CustomFormat;
base.Format = DateTimePickerFormat.Custom;
base.CustomFormat = " ";
}
/// <summary>
/// 恢复默认格式
/// </summary>
private void SetDefaultFormat()
{
base.Format = _format;
base.CustomFormat = _customFormat;
}
}
说明:
(1)基本结构沿用你在17楼提供的代码 (感觉方法还可以优化)
(2)新加一字段 isChanged 用于记录在选择窗口内是否通过选择改变了value.
(3)重写一事件 OnDropDown 用于初始化 isChanged = false
(4)在OnCloseUp事件中, if (isChanged) SetDefaultFormat();
public partial class DateTimeControl : DateTimePicker
{
DateTimePickerFormat _format;
string _customFormat;
bool SetValue = false;//表示当前是否是系统在改变Value属性
bool isnull = false; /// <summary>
/// 获取或设置分配给控件的日期/时间值
/// </summary>
public new DateTime? Value
{
get
{
if (isnull)
return new DateTime?();
else
return base.Value; }
set
{
if (value == null)
{
isnull = true;
SetValue = true;
base.Value = base.MinDate;
SetValue = false;
SetValueNullToFormat(); }
else
{
isnull = false;
FurbishFormat();
SetValue = true;
base.Value = (DateTime)value;
SetValue = false;
}
}
} /// <summary>
/// 格式掩码类型
/// </summary>
public new DateTimePickerFormat Format
{
get
{
return base.Format;
}
set
{
base.Format = value;
_format = base.Format;
}
}
/// <summary>
/// 自定义格式
/// </summary>
public new string CustomFormat
{
get
{
return base.CustomFormat;
}
set
{
base.CustomFormat = value;
_customFormat = base.CustomFormat;
}
}
/// <summary>
/// 构造方法
/// </summary>
public CusDateTimePicker()
{ _format = base.Format;
_customFormat = base.CustomFormat;
} protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete)
{
Value = null;
}
base.OnKeyUp(e);
}
protected override void OnValueChanged(EventArgs eventargs)
{
if (!SetValue)//如果当前是系统在改变Value属性,将不执行以下操作
{
DateTime dt = base.Value.Date + DateTime.Now.TimeOfDay;
Value = dt;
}
base.OnValueChanged(eventargs);
}
/// <summary>
/// 设置值为空时的格式
/// </summary>
private void SetValueNullToFormat()
{
SetValue = true;//设置当前是系统在改变Value属性.
base.Format = DateTimePickerFormat.Custom;
base.CustomFormat = " ";
SetValue = false;
}
/// <summary>
/// 恢复格式
/// </summary>
private void FurbishFormat()
{
base.Format = _format;
base.CustomFormat = _customFormat;
}
}
不过我也想了好久,最多也只能到这个份了. 不然就得继承Control自己另写一个DateTimePicker好了,谢谢了.. 特别感谢qldsrx