在C#中,控件的Changed事件(例如,numericupdown)会被触发,无论该值是由用户直接更改还是由于某些其他事件而以编程方式更改。
有没有办法确定事件是否因用户输入而发生?例如,手动更改numericUpDown1的值并单击button1将显示“value changed”。如果通过用户点击控件中的向上/向下箭头而不是因为单击button1而更改了“值已更改”,该怎么办?
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
MessageBox.Show("value changed");
}
private void button1_Click_1(object sender, EventArgs e)
{
numericUpDown1.Value = 3;
}
答案 0 :(得分:5)
没有好办法。您可以找到特定情况的解决方法,例如
在按钮点击事件处理程序中设置一个标志,禁止显示消息框。
一般情况下,您应该尝试按照价值变化无关的方式整理表单。
答案 1 :(得分:5)
您可以检查numericUpDown是否为ActiveControl。在按钮单击期间设置numericUpDown的值时,button1应该是ActiveControl。当用户通过numericUpDown更改值时,numericUpDown应该是ActiveControl。
if(numericUpDown1 == this.ActiveControl)
{
MessageBox.Show("value changed");
}
答案 2 :(得分:1)
不,没有内置方法可以执行您要执行的操作,因为触发事件的代码会在值更改时触发。
答案 3 :(得分:0)
这是我在VB .NET中的解决方案
Private m_blnIsValueChangedByGui As Boolean = True
Public Property IsValueChangedByGui() As Boolean
Get
Return m_blnIsValueChangedByGui
End Get
Set(ByVal value As Boolean)
m_blnIsValueChangedByGui = value
End Set
End Property
Public Shadows Property Value() As Decimal
Get
Return MyBase.Value
End Get
Set(ByVal value As Decimal)
IsValueChangedByGui = False
If (value > Me.Maximum) Then
MyBase.Value = Me.Maximum
ElseIf (value < Me.Minimum) Then
MyBase.Value = Me.Minimum
Else
MyBase.Value = value
End If
IsValueChangedByGui = True
End Set
End Property
答案 4 :(得分:0)
一个有趣的案例是ComboBox控件,它通过SelectionChangeCommitted事件区分选择的更改,该事件仅在用户通过GUI进行更改时引发,而SelectedIndexChanged事件在每次SelectedIndex时引发财产变化。您可以检查ComboBox的源代码并查看它是如何完成的。当然,不能保证该原则可以转移到其他控制措施。
答案 5 :(得分:0)
之前我已经解决了这个问题。我们以NumericUpDown控件作为说明性示例。
首先,创建一个继承自NumericUpDown的新控件(称为MyNumericUpDown)。为UpButton,DownButton和OnLostFocus方法创建替代。还要创建一个用于以编程方式设置控件值的公共方法。创建一个名为&#39; ValueChangedType&#39;的枚举类型。它有4个不同的值,分别叫做TextEdit,UpButton,DownButton和Programmatic(或者随意调用它们)。还要创建一个名为ChangedType的属性,其值为ValueChangedType。这是班级的样子。
public partial class MyNumericUpDown : NumericUpDown
{
public enum ValueChangedType
{
TextEdit,
UpButton,
DownButton,
Programmatic
}
public ValueChangedType ChangedType = ValueChangedType.Programmatic;
public MyNumericUpDown()
{
InitializeComponent();
}
public override void UpButton()
{
this.ChangedType = ValueChangedType.UpButton;
base.UpButton();
}
public override void DownButton()
{
this.ChangedType = ValueChangedType.DownButton;
base.DownButton();
}
protected override void OnLostFocus(EventArgs e)
{
this.ChangedType = ValueChangedType.TextEdit;
base.OnLostFocus(e);
}
public void SetValue(decimal val)
{
this.ChangedType = ValueChangedType.Programmatic;
this.Value = val;
}
}
现在,在您的表单中,创建一个MyNumericUpDown控件(将其命名为“myNUD&#39;”)。在控件的ValueChanged事件处理程序中,您可以获取ChangedType属性的值,并对其执行某些操作:
private void myNUD_ValueChanged(object sender, EventArgs e)
{
MyNumericUpDown nud = sender as MyNumericUpDown;
var myChangedType = nud.ChangedType;
/* do something */
}