当用户与DateTimePicker控件交互时引发了什么事件?
我是c#的新手,在我的程序中使用DateTimePicker Value更改了事件,但我发现当用户点击箭头时也会发生ValueChanged事件,或者如果以编程方式更改了值,我只想识别DateTimePicker的用户交互(不是以编程方式更改值时,有没有办法做到这一点?
是的,请查看MSDN文档 。 特别是OnValueChanged
事件
您将需要使用此事件连接您的控件:
在构造函数方法中:
dateTimePickerControl.ValueChanged += new EventHandler(picker_ValueChanged);
这是方法签名:
void f_ValueChanged(object sender, EventArgs e) { //Do whatever you need when the value changes here }
您也可以从设计师那里做到这一点。 如果转到“属性”,然后转到“事件”部分,则会列出所有事件。 只需双击,它就会为您创建方法签名和连线。
更新到您的更新
如果您特别想要检查这是否是程序化更改,那么您希望执行以下操作:
在类中创建一个全局变量
Boolean isProgrammaticEvent = false
;
在您的程序化更改之前:
isProgrammaticEvent = true; //Change picker value
在您的活动布线中:
void f_ValueChanged(object sender, EventArgs e) { Boolean isThisProgrammatic = isProgrammaticEvent; isProgrammaticEvent = false; if(isThisProgrammatic) return; //Do whatever you need when the value changes here }
您可以关闭DropDown
事件上的事件处理程序,并在用户在CloseUp
事件中关闭下拉日历时将其重新打开:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { this.Text = dateTimePicker1.Value.ToString(); } private void dateTimePicker1_DropDown(object sender, EventArgs e) { dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; } private void dateTimePicker1_CloseUp(object sender, EventArgs e) { dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; dateTimePicker1_ValueChanged(sender, e); }
这可以防止在用户在下拉过程中滚动日历时触发ValueChanged
事件。
要以编程方式更改日期而不触发事件,请使用相同的概念:
private void ProgramChangesDateTime(DateTime dt) { dateTimePicker1.ValueChanged -= dateTimePicker1_ValueChanged; dateTimePicker1.Value = dt; dateTimePicker1.ValueChanged += dateTimePicker1_ValueChanged; }
您可以从DateTimePicker
派生以了解用户何时进行了更改:
class DateTimePickerUser : DateTimePicker { private bool userSetValue; public bool UserSetValue { get { return userSetValue; } } public DateTimePickerUser() { userSetValue = true; } public new DateTime Value { get { return base.Value; } set { userSetValue = false; base.Value = value; userSetValue = true; } } }
在Form
上使用DateTimePickerUser
,只需检查ValueChanged事件中的标志:
private void dateTimePickerUser1_ValueChanged(object sender, EventArgs e) { if (dateTimePickerUser1.UserSetValue) this.Text = "User changed value."; else this.Text = "Code changed the value."; }
这与Justin Pihony的例子类似,但你不需要自己设置标志,只需依靠这个控件即可。
- 如何在不使用所有子节点中的XNamespace的情况下为子节点创建具有默认命名空间的XElement
- Canonical:如何从Excel VBA调用.NET方法
- entity framework6异步操作和TranscationScope
- 如何获得图像的分辨率? (JPEG,GIF,PNG,JPG)
- 在C#中从mongodb获取单个对象
- .NET LocalReport / .rdlc AppDomain问题
- Convert.ToDecimal(string)和Decimal.Parse(string)之间的区别
- System.Net.Mail和=?utf-8?B?XXXXX …标题
- 有没有办法从Visual Studio Express生成DLL文件而无需显式创建DLL项目?