вызвать событие из form2 в form1 - PullRequest
0 голосов
/ 01 октября 2010

привет вызвать событие из form2 в form1?

например:

Следующий код в форму2:

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

Что писать в форме1?

Ответы [ 5 ]

2 голосов
/ 01 октября 2010

Почему вы хотите назвать событие? Будете ли вы знать отправителя и Аргументы событий?

Почему бы вам просто не создать публичный метод в Form2, который Form1 может видеть?

0 голосов
/ 02 октября 2010

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: Form {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");
    }
}

Когда пользователь нажимает кнопку 1 в форме публикации, форма подписки выполнит код, связанный с делегатом, в результате чего появится окно сообщения с сообщением http://stackoverflow.com.

0 голосов
/ 01 октября 2010

Вы не можете поднять Событие за пределами класса. Соглашение состоит в том, что вы вызываете метод 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";
}
0 голосов
/ 01 октября 2010

Вы не можете вызывать закрытые члены класса извне.

Вы можете изменить доступность на 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();
0 голосов
/ 01 октября 2010

как насчет form2.Form2_Load(this, null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...