簡體   English   中英

C#-將自定義參數傳遞給事件

[英]C# - Passing custom arguments to events

因此,我試圖向事件發送自定義參數,但是它從未起作用,我嘗試了許多不同的方法,但是我卻從未使其起作用,所以基本上!

public void CreateEmojiList()
        {
            CreateAllEmojis();
            int btnCount = 0;

            foreach(Emoji emoji in emojiList)
            {
                Button btnEmoji = new Button();
                btnEmoji.Size = new Size(40, 36);
                btnEmoji.FlatStyle = FlatStyle.Flat;
                btnEmoji.FlatAppearance.MouseDownBackColor = Color.Cyan;
                btnEmoji.Cursor = Cursors.Hand;
                btnEmoji.Font = new Font("Bahnschrift", 6.75f);
                btnEmoji.Text = emoji.EmojiText;
                btnEmoji.Top = (panel_main.Controls.OfType<Button>().Count<Button>() / 4) * (1 + btnEmoji.Height) + 6;
                btnEmoji.Left = (btnEmoji.Width + 1) * btnCount + 6;
                panel_main.Controls.Add(btnEmoji);
                btnEmoji.Click += //What do I do here?
;                btnCount++;

                if (btnCount == 4)
                    btnCount = 0;
            }
        }

        protected virtual void OnEmojiClick(EmojiClickEventArgs e)
        {
            if (this.EmojiClick != null)
                EmojiClick(e);
        }

這是我想用來傳遞參數的類:

public class EmojiClickEventArgs : EventArgs
    {
        private string emojiText;
        private string emojiName;

        public EmojiClickEventArgs(string EmojiText, string EmojiName)
        {
            this.EmojiText = EmojiText;
            this.EmojiName = EmojiName;
        }

        public string EmojiText { get { return emojiText; } set { emojiText = value; } }
        public string EmojiName { get { return emojiName; } set { emojiName = value; } }
    }

我想從emoji.EmojiText和emoji.EmojiName中獲得這兩個值

一種方法是從Button繼承並創建一個名為EmojiButton的類。 然后,您聲明一個與您的事件處理程序的簽名匹配的委托。 之后,使用EmojiButton類中的委托聲明一個事件,並將EmojiTextEmojiName之類的屬性也添加到按鈕子類中。 最后,您需要將按鈕單擊事件與自定義事件鏈接。 每當單擊按鈕時,引發事件並傳遞參數,即this.EmojiText, this.EmojiName

另一種方法是將Emoji對象分配給Tag屬性。 然后,您可以使用普通的EventHandler簽名( object sender, EventArgs e )編寫事件處理程序,並查看senderTag是什么。 然后,您可以將Tag投放到Emoji並訪問其屬性。

您可以利用閉包為每個按鈕的事件處理程序“打包”其他事件數據。 只要確保不要關閉循環變量即可。

    public void CreateEmojiList()
    {
        CreateAllEmojis();
        int btnCount = 0;

        foreach(Emoji emoji in emojiList)
        {
            Button btnEmoji = new Button();
            btnEmoji.Size = new Size(40, 36);
            btnEmoji.FlatStyle = FlatStyle.Flat;
            btnEmoji.FlatAppearance.MouseDownBackColor = Color.Cyan;
            btnEmoji.Cursor = Cursors.Hand;
            btnEmoji.Font = new Font("Bahnschrift", 6.75f);
            btnEmoji.Text = emoji.EmojiText;
            btnEmoji.Top = (panel_main.Controls.OfType<Button>().Count<Button>() / 4) * (1 + btnEmoji.Height) + 6;
            btnEmoji.Left = (btnEmoji.Width + 1) * btnCount + 6;
            panel_main.Controls.Add(btnEmoji);
            var emojiCopy = emoji; //don't close on the loop variable!
            btnEmoji.Click += (sender,args) => OnEmojiClick(emojiCopy);
            btnCount++;

            if (btnCount == 4)
                btnCount = 0;
        }
    }

    protected virtual void OnEmojiClick(Emoji emoji)
    {
        //do something
    }

我想到的最快的解決方案是,它不暗示自定義UserControl類的定義, Button的子類和其他類似的做法是:

btnEmoji.Click += (sender, e) =>
{
    Button b = (Button)sender;

    // let's suppose that the button name corresponds to the emoji name
    String emojiName = b.Name; 
    // let's suppose that the button tag contains the emoji text
    String emojiText = (String)b.Tag;

    Emoji_Clicked(sender, e, (new EmojiClickEventArgs(emojiText, emojiName)));
};

private void Emoji_Clicked(Object sender, EventArgs e, EmojiClickEventArgs ee)
{
    // Your code...
}

首先需要定義委托,然后創建一個實例。

class Emojis
{
       // public delegate void EmojiClickEventHandler(object sender,EventArgs args);
       //public event EmojiEventHandler EmojiClicked;
       //you can use above two lines or replace them instead below code.
        public event EventHandler<EmojiClickEventArgs> EmojiClicked;
        public void CreateEmojiList()
         {
             CreateAllEmojis();
             int btnCount = 0;
             //rest of the code
            panel_main.Controls.Add(btnEmoji);
            btnEmoji.Click += OnEmojiClick(btnEmoji);
            btnCount++;
        }

   protected virtual void OnEmojiClick(Button emoji)
   {
    //Here null check to handle if no subscribers for the event
    if(EmojiClicked!=null)
       {
           //there is no name property define for emoji but only text hence passing only text.
          EmojiClicked(this ,new  EmojiClickEventArgs(emoji.Text,emoji.Text){ });
       }
   }
   private void Emoji_Clicked(Object sender, EmojiClickEventArgs args)
        {
            Button mybutton = sender as Button;
            Console.WriteLine("emoji text "+ args.Text);
        }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM