Открытие новой формы из обработчика событий в приложении Main Form Hangs - PullRequest
0 голосов
/ 25 февраля 2009

Я пытаюсь открыть новую форму из обработчика событий в главной форме в программе на C #. Обработчик события вызывается правильно, и он открывает новую форму, но новая форма заморожена и даже не заполняется изначально.

Я могу создать кнопку на главной форме и создать новую форму после нажатия кнопки, но она не работает должным образом, когда выполняется из обработчика событий.

Обработчику событий не нужно знать результаты всего, что сделано в создаваемой форме - ему просто нужно создать его и убраться с дороги.

Что мне нужно сделать? Новая форма должна работать независимо от основной формы.

Вот где я определяю обработчик событий:

ibclient.RealTimeBar += new EventHandler<RealTimeBarEventArgs>(ibclient_RealTimeBar);

Вот код обработчика события:

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e)
{
    FancyForm a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

Создание новой формы нажатием кнопки работает нормально:

private void button7_Click(object sender, EventArgs e)
{
    FancyForm a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

У меня была точно такая же проблема, я использовал код Квинтина, и теперь он отлично работает ...

Я внес некоторые изменения для работы с фреймворком 2.0, вот что я сделал: Сначала я создал делегат, указывая на метод, который открывает форму:

public delegate void pantallazo();
pantallazo obj=new pantallazo(this.ShowFancyForm);

Метод, который открывает форму, тот же, что предоставлен Quintin:

smatiCliente a_fancy_form;   //smatiCliente  is the name of my new form class...
    private void ShowFancyForm()
    {
        if (null != a_fancy_form) return;
        a_fancy_form = new smatiCliente();
        this.Hide();
        a_fancy_form.Show();
    }

И внутри обработчика событий моей программы вы сделали несколько простых изменений:

 if(this.InvokeRequired)
                    {
                        this.Invoke(obj);
                    }
                    ShowFancyForm();

Вот и все, теперь это прекрасно работает. Метод Invoke выполняет соответствующий делегат, поэтому форма теперь создается под основным пользовательским интерфейсом.

Надеюсь, это сработает, и большое спасибо, Квинтин!

2 голосов
/ 25 февраля 2009

Можете ли вы опубликовать код обработчика события? .. Также событие вызывается в отдельном потоке, а не в главном интерфейсе?

Edit:
Не уверен, что делает панель реального времени, но попробуйте проверить наличие запроса в вашей форме, чтобы вы могли создать дополнительную форму в том же потоке, что и основной пользовательский интерфейс.

void ibclient_RealTimeBar(object sender, RealTimeBarEventArgs e)
{
    if(this.InvokeRequired)
    {
        this.Invoke(((Action)() => ShowFancyForm()));
    }

    ShowFancyForm();
}

FancyForm a_fancy_form;
private void ShowFancyForm()
{
    if(null != a_fancy_form)return;

    a_fancy_form = new FancyForm();
    a_fancy_form.Show();
}

Конечно, для этого используются грязные ярлыки и предполагается, что он равен 3,5, но вы можете изменить его по своему усмотрению.

Кроме того, я переместил декларацию FancyForm за пределы области действия метода ... снова адаптируюсь к вашим потребностям.

0 голосов
/ 25 февраля 2009

Знаете ли вы, какой поток запущен в обработчике событий? Я считаю, что это может быть основной поток GUI для работы.

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