首頁>Program>source

我有一个包含3个標簽的UserControl.我想為其添加一个事件,该事件在其中一个標簽的文字更改時發生。
我正在使用Visual Studio 2010

最新回復
  • 5月前
    1 #

    首先,您需要在類中宣告事件(以及方法和構造函式):

    public event EventHandler LabelsTextChanged;
    

    然後,您需要建立一種方法来處理各个標簽的 TextChanged 事件。

    private void HandleLabelTextChanged(object sender, EventArgs e)
    {
        // we'll explain this in a minute
        this.OnLabelsTextChanged(EventArgs.Empty);
    }
    

    在某个地方,可能在控制元件的構造函式中,您需要订阅標簽的 TextChanged 事件。

    myLabel1.TextChanged += this.HandleLabelTextChanged;
    myLabel2.TextChanged += this.HandleLabelTextChanged;
    myLabel3.TextChanged += this.HandleLabelTextChanged;
    

    現在為 HandleLabelsTextChanged 方法.我们可以养 LabelsTextChanged 直; 但是,.NET框架設計指南指出,建立 OnEventName是最佳實践 受保護的虛擬方法来為我们引發事件.這樣,繼承類可以通過覆盖 OnEventName来"處理"事件 方法,結果比订阅事件要好一些.即使您认為您永远也不会超越 OnEventName 方法,無論如何都要养成习惯,因為這可以簡化事件的产生過程。

    這是我们的 OnLabelsTextChanged

    protected virtual void OnLabelsTextChanged(EventArgs e)
    {
        EventHandler handler = this.LabelsTextChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    

    我们必须檢查是否為空,因為没有订阅者的事件為空.如果我们尝試引發null事件,則会得到一个 NullReferenceException .請註意,我们複製了事件的 EventHandler 在檢查它是否為null並引發事件之前將其轉換為區域性變數.如果我们改為這樣做:

    if (this.LabelsTextChanged != null)
    {
        this.LabelsTextChanged(this, e);
    }
    

    我们將在無效檢查和事件引發之間有一个競爭條件.如果恰好發生在事件引發之前,但在我们檢查為空之後,事件的订阅者取消了订阅,則將引發異常.您通常不会遇到此問题,但是最好养成以安全方式編寫它的习惯。

    Edit: 這就是 public event EventHandler LabelsTextChanged; 行應放置:

    namespace YourNamespace
    {
        class MyUserControl : UserControl
        {
            // it needs to be here:
            public event EventHandler LabelsTextChanged;
            ...
        }
    }
    

    以下是事件設計的框架設計指南,供您进一步阅讀。

  • 5月前
    2 #

    首先,應在使用者控制元件中宣告一个事件,例如:

    public event EventHandler TextOfLabelChanged;
    

    然後,您必须在執行時呼叫繫結到事件(如果有)的回撥函式。您可以通過處理標簽的TextChanged事件来做到這一點:

    public void LabelTextChanged(object sender,EventArgs e)
    {
    if(TextOfLabelChanged!=null)
    TextOfLabelChanged(sender,e);
    }
    

    如果愿意,您可以拥有自己的EventArgs物件。

    在代碼中的某个位置,應將標簽TextChanged事件繫結到此方法,如下所示:

    _myLabel.TextChanged+=LabelTextChanged;
    

  • 5月前
    3 #

    編譯錯誤,它在第二行顯示:"預期的類,委託,列舉,介面或結構"似乎与"事件..."有關。


    這两行必须在類宣告的內部。

    public delegate void TextChangedEventHandler(object sender, EventArgs e);
    public event TextChangedEventHandler LabelTextChanged;
    

  • 5月前
    4 #

    有一種非常簡單的方法!

    在UserControl表單上:

    將屬性更改為公開以在任何地方訪問

    在使用UserControl的主窗體上:

    .5:在 using中 區域添加 using userControl1=UserControl.userControl1

    1。將" Laod"事件添加到您的UserControl中:

    this.userControl1.Load += new System.EventHandler(this.userControl1_Load);
    

    2。在userControl1_Load中:

    private void userControl1_Load(object sender, EventArgs e)
    {
         (sender as UserControl1).label1.TextChanged += label1_TextChanged; 
         //add a 'TextChanged' event to the label1 of UserControl1 
         OR use direct cast:
         ((UserControl1) sender).label1.TextChanged += label1_TextChanged;
    }
    

    3。在label1_TextChanged中:

    private void label1_TextChanged(object sender, EventArgs e)
     {
         //do whatever you want
     }
    

  • 5月前
    5 #

    public delegate void TextChangedEventHandler(object sender, EventArgs e);
    public event TextChangedEventHandler LabelTextChanged;
    // ...
    protected void MyTextBox_TextChanged(object sender, EventArgs e)
    {
        if (LabelTextChanged != null) {
            LabelTextChanged(this, e);
        }
    }
    

  • javascript:檢查巢狀物件中是否存在物件成員
  • html:為什麼隱藏的溢位会阻止浮動元素逃离其容器?