如何将变量传递给按钮事件方法?

Bil*_*soe 17 c# events

我需要能够将两个对象传递给单击按钮时被触发的方法.我该怎么做呢?

到目前为止,我一直在寻找创建一个已更改的eventArgs:

 public class CompArgs : System.EventArgs
    {
    private object metode;
    private Type typen;

    public CompArgs(object m, Type t)
    {
        this.metode = m;
        this.typen = t;
    }

    public object Metode()
    {
        return metode;
    }

    public Type Typen()
    {
        return typen;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我该如何使用它呢?是否有可能以某种方式覆盖按钮的单击事件以使用自定义事件处理程序,它将CompArgs作为参数?

private void button1_Click(object sender, EventArgs e)
        {


            Assembly assembly = Assembly.LoadFile(@"c:\components.dll");

            int counter = 0;

            foreach (Type type in assembly.GetTypes())
            {
                if (type.IsClass == true)
                {

                    Button btn = new Button();
                    btn.Location = new Point(174 + (counter * 100),10);
                    btn.Size = new Size(95, 23);
                    btn.Name = type.Name;
                    btn.Text = type.Name;
                    btn.UseVisualStyleBackColor = true;


                    this.Controls.Add(btn);

                    object obj = Activator.CreateInstance(type);

                    //I need to pass on obj and type to the btn_Click
                    btn.Click += new eventHandler(btn_Click);

                    counter++;
                }
            }
         }
Run Code Online (Sandbox Code Playgroud)

我需要它的事件方法:

private void btn_Click(object sender, CompArgs ca)
        {
                MessageBox.Show((string)ca.Typen().InvokeMember("getMyName",
                             BindingFlags.Default | BindingFlags.InvokeMethod,
                             null,
                             ca.Metode(),
                             null));

        }
Run Code Online (Sandbox Code Playgroud)

Rud*_*osa 49

哇,你们这完全是困难的.无需任何自定义类或方法覆盖.在这个例子中,我只需要传递一个标签索引号.您可以指定所需的任何内容,只要您的方法期望该值类型即可.

button.Click += (sender, EventArgs) => { buttonNext_Click(sender, EventArgs, item.NextTabIndex); };

void buttonNext_Click(object sender, EventArgs e, int index)
    {
       //your code
    }
Run Code Online (Sandbox Code Playgroud)

  • 嘿伙计们,我知道这是一篇较老的帖子,但我想我会指出,如果你在上面的代码中输入一个变量,那将会引发一个问题.我有一个按钮,我想在按键上发送切换器,我使用上面的代码(这很棒)但它不喜欢布尔变量...这是方法签名:`private void UpdateDBButton_Click(object sender,EventArgs e) ,bool fullReset)`和事件处理程序行:`UpdateDBButton.Click + =(sender,EventArgs)=> {bool fullReset = false; UpdateDBButton_Click(sender,EventArgs,fullReset); };` (2认同)

Wra*_*ath 6

您是否只是在承载按钮的表单上设置属性或成员变量,并从按钮单击事件访问这些变量?

编辑:反馈评论后的自定义按钮类建议(不同于上面的建议)

class MyButton : Button
{
    private Type m_TYpe;

    private object m_Object;

    public object Object
    {
        get { return m_Object; }
        set { m_Object = value; }
    }

    public Type TYpe
    {
        get { return m_TYpe; }
        set { m_TYpe = value; }
    }
}




Button1Click(object sender, EventArgs args)
{
  MyButton mb = (sender as MyButton);

  //then you can access Mb.Type
  //and  Mb.object
}
Run Code Online (Sandbox Code Playgroud)

  • @WraithNath - 我以前使用过这种方法,但觉得这是一种不干净的方法。我需要按钮来引用正确的对象,所以我上次这样做的方法是将对象存储在列表中。将按钮对象的相对索引保存在其 Tag 属性中,然后在需要时对其进行解析。 (2认同)