none
如何用C#监视一个控件的属性的改变 RRS feed

答案

  • 为属性变量添加事件,属性监视者去订阅这个事件。如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Configuration;
    
    namespace WindowsFormsApplication4
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          var c = new TestControl();
          c.ValueChanged += (o, ex) =>
          {
            MessageBox.Show(string.Format("new value is {0}", c.Value));
          };
    
          c.Value = "123";
        }
      }
    
      public class TestControl : Control
      {
        private string fValue;
    
        public string Value
        {
          get { return fValue; }
          set
          {
            if (fValue != value)
            {
              fValue = value;
              if (this.valueChanged != null)
                this.valueChanged(this, null);
            }
          }
        }
    
        PropertyChangedEventHandler valueChanged;
        public event PropertyChangedEventHandler ValueChanged
        {
          add { valueChanged += value; }
          remove { valueChanged -= value; }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2011年8月26日 4:55
    版主
  • Hi Xeon,

    不知道你所说的控件属性是此控件已经具有的还是你扩展了控件, 自己给它添加的?
    如果是自己添加的话就可以按照肖小勇的办法在属性的Set方法中去对比新的值和旧的值, 如果不同的话就去触发相应的事件.

    也可能是此控件的这个属性本来就已经有相关的事件, 则直接使用, 比如TextBox.TextChanged Event, 参见下面的MSDN文档:
    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox.textchanged.aspx.

    祝你快乐每一天,
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月29日 6:07
    版主

全部回复

  • 最好的办法就是写个事件。然后订阅它。

     

    如果这个控件本身有这个事件,就直接订阅这个事件。


    family as water
    2011年8月26日 4:48
  • 为属性变量添加事件,属性监视者去订阅这个事件。如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Configuration;
    
    namespace WindowsFormsApplication4
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          var c = new TestControl();
          c.ValueChanged += (o, ex) =>
          {
            MessageBox.Show(string.Format("new value is {0}", c.Value));
          };
    
          c.Value = "123";
        }
      }
    
      public class TestControl : Control
      {
        private string fValue;
    
        public string Value
        {
          get { return fValue; }
          set
          {
            if (fValue != value)
            {
              fValue = value;
              if (this.valueChanged != null)
                this.valueChanged(this, null);
            }
          }
        }
    
        PropertyChangedEventHandler valueChanged;
        public event PropertyChangedEventHandler ValueChanged
        {
          add { valueChanged += value; }
          remove { valueChanged -= value; }
        }
      }
    }
    
    


    知识改变命运,奋斗成就人生!
    2011年8月26日 4:55
    版主
  • Hi Xeon,

    不知道你所说的控件属性是此控件已经具有的还是你扩展了控件, 自己给它添加的?
    如果是自己添加的话就可以按照肖小勇的办法在属性的Set方法中去对比新的值和旧的值, 如果不同的话就去触发相应的事件.

    也可能是此控件的这个属性本来就已经有相关的事件, 则直接使用, 比如TextBox.TextChanged Event, 参见下面的MSDN文档:
    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox.textchanged.aspx.

    祝你快乐每一天,
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月29日 6:07
    版主