确定是否从用户输入发生更改事件

时间:2009-03-16 15:00:07

标签: c# .net

在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;
    }

6 个答案:

答案 0 :(得分:5)

没有好办法。您可以找到特定情况的解决方法,例如

  • 在数字下拉列表中收听MouseDown或其他内容而不是valueChanged。
  • 在按钮点击事件处理程序中设置一个标志,禁止显示消息框。

    一般情况下,您应该尝试按照价值变化无关的方式整理表单。

答案 1 :(得分:5)

您可以检查numericUpDown是否为ActiveControl。在按钮单击期间设置numericUpDown的值时,button1应该是ActiveControl。当用户通过numericUpDown更改值时,numericUpDown应该是ActiveControl。

if(numericUpDown1 == this.ActiveControl)
{
    MessageBox.Show("value changed");
}

答案 2 :(得分:1)

不,没有内置方法可以执行您要执行的操作,因为触发事件的代码会在值更改时触发。

答案 3 :(得分:0)

  1. 继承NumericUpDown类
  2. 创建一个标志,用于确定以编程方式更改的值,或由GUI
  3. 更改
  4. 重载值属性以设置上面的标志
  5. 这是我在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 */
    }