簡體   English   中英

在form1中從form2調用事件

[英]call event from form2 in form1

您好在form1的form2調用事件嗎?

例如 :

將以下代碼轉換為form2:

    private void Form2_Load(object sender, EventArgs e)
    {
        MessageBox.Show("http://stackoverflow.com");
    }

在form1中寫什么?

您為什么要致電此活動? 您知道發件人和事件Args嗎?

您為什么不只在Form2中創建Form1能夠看到的公共方法?

怎么樣form2.Form2_Load(this, null)

您不能從班級外部呼叫班級的私人成員。

您可以將internal的可訪問性更改為internal ,這將使其在程序集中可見-如果您的form1在同一程序集中。

或者,您可以將其設置為public方法,從而使其可以全局訪問。

但是,您不應以這種方式調用事件處理程序-它們應該處理聲明類引發的事件。

對於您提供的示例代碼,更好的解決方案是創建一個可從此事件處理程序調用的公共或內部方法:

private void Form2_Load(object sender, EventArgs e)
{
    MyMethod();
}

public MyMethod()
{
    MessageBox.Show("http://stackoverflow.com");
}

為了從form1調用此方法,它需要了解form2

 // in form1
 Form frm2 = new Form2();
 frm2.MyMethod();

您不能從課堂外引發一個活動。 約定是您在類中調用OnEventname方法。 通常,此方法是受保護的(不能僅從類本身或從其繼承的其他類訪問)

// in form1
private void Method1()
{
    using (var form2 = new Form2())
    {
        form2.Show();

        form2.RaiseLoadEvent(EventArgs.Empty);
    }
}

// Create this method in form2
public void RaiseLoadEvent(EventArgs e)
{
    OnLoad(this, e);
}


// The OnLoad method already exists in form 2 
// But it usually looks like this
protected void OnLoad(EventArgs e)
{
    var eh = LoadEventHandler;
    if (eh != null) 
    {
       eh(this, e); 
    }
}

但我不建議引發LoadEvent,因為它在創建表單后僅被引發一次。 更常見的是對Load事件作出反應以修改表單。

privat void Method1()
{
    using (var form2 = new Form2())
    {
        // Add Event Handler
        form2.Load += new EventHandler(form2_Load);
        form2.ShowDialog();
    }
    // Allways remove Event Handler to avoid memory leaks
    form2.Load -= new EventHandler(form2_Load);
} 

private void form2_Load(object sender, EventArgs e)
{
    form2.Text = "Hello from form1";
}

Form1(事件發布者)應公開一個單獨的公共事件屬性,供Form2(訂閱者)訂閱。

例如:發布事件的表單將如下所示:

public partial class Publisher : Form
{
    public event PostUpdateHandler OnPostUpdate;

    public Publisher()
    {
        InitializeComponent();

        new Subscriber(this).Show();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (OnPostUpdate != null)
        {
            OnPostUpdate(new PostUpdateArgs(textBox1.Text));
        }
    }
}

public delegate void PostUpdateHandler(PostUpdateArgs args);
public class PostUpdateArgs : EventArgs
{
    public string UpdateText;

    public PostUpdateArgs(string s)
    {
        UpdateText = s;
    }
}

訂閱表單如下所示:

公共部分類Subscriber:表單{public Subscriber(){InitializeComponent(); }

    public Subscriber(Publisher publisher) : this()
    {
        publisher.OnPostUpdate += new PostUpdateHandler(publisher_OnPostUpdate);
    }

    private void publisher_OnPostUpdate(PostUpdateArgs args)
    {
        this.Form2_Load(null, null);
    }

    private void Subscriber_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Dispose();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        MessageBox.Show("http://stackoverflow.com");
    }
}

當用戶在發布表單上按下button1時,訂閱表單將執行與委托相關聯的代碼,從而導致顯示一個帶有消息http://stackoverflow.com的消息框。

暫無
暫無

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

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