Диалог не отображается должным образом из-за цикла после использования метода .Show () в C # - PullRequest
2 голосов
/ 18 декабря 2009

Извините, если мне кажется, что я пишу тот же вопрос. Проблема похожа, но я узнаю все больше и больше о проблеме каждый раз. Так что заранее спасибо за помощь. Это высоко ценится. : D

Я хочу показать форму / диалог с определенным условием внутри цикла. Моя проблема в том, что я создал этот сегмент кода в моей программе, и когда я выполняю свое условие и показываю свою форму, он не отображается должным образом. Я сузил проблему до цикла, поскольку он отлично работает в других местах программы. Но всякий раз, когда я пытаюсь вызвать метод .Show в моей форме перед началом цикла или внутри цикла, он не отображается должным образом. В частности, моя форма / диалог имеет только одну метку на данный момент. Вот что происходит, когда я вызываю метод .Show в моей форме / диалоге:

  • Невозможно взаимодействовать (IE перемещает или закрывает его с помощью «X») с формой / диалоговым окном - значок мыши показывает, что он думает / работает, если вы наводите курсор на форму / диалоговое окно.
  • Фон не загружается - рамка и заголовок / заголовок загружаются для диалога, но фон не загружается. На самом деле это не так, чтобы начать, чтобы вы могли видеть через форму / диалог. Если вы щелкнете где-нибудь, фон станет черным.
  • Метка не загружается - это, вероятно, связано с фоном, но вы не можете видеть метку или контур / затенение там, где это должно быть.

Вот мой сегмент кода:

    private void ConnectSequence(object sender, DoWorkEventArgs e)
    {
        EstablishingConnection ourECF = new EstablishingConnection();

        // Loop till connected
        while (!this.ourCC.Connected)
        {
            this.ourCC.InitializeConnection();

            // If we didn't connect and ourECF isn't already shown then show it
            if (!this.ourCC.Connected && false == ourECF.Visible)
            {
                ourECF.Show();
            }
        }

        ourECF.Dispose();
    }

Вот что я пытаюсь сделать:

  • Цикл до установления соединения
  • Если после первой попытки подключения произошел сбой, отобразите форму / диалоговое окно, предупреждающее пользователя о попытке установить соединение

Код сам по себе прекрасно работает. Если я выключаю сервер и запускаю клиентское приложение, появляется всплывающее окно / диалоговое окно, которое не работает должным образом. Когда я снова включаю сервер, он выходит из цикла и избавляется от формы / диалога. В настоящее время у меня есть BackgroundWorker, вызывающий ConnectSequence, так как я думал, что это решит мою проблему.

Что я пробовал до сих пор:

  • Использование потоков (System.Threads & BackgroundWorker)
  • Превращение его свойства .Visible в true (.Показывает это, но приводит его в движение)
  • Реализовал нашу ECF и вызвал ее в столько разных мест, сколько я смог найти, чтобы посмотреть, смогу ли я найти работу.

Но в итоге это не работает из-за этого цикла. И я понятия не имею, почему. Любая помощь приветствуется. Я так благодарен за всю вашу помощь. : D

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Вы исчерпываете цикл сообщений, формы требуют перекачки сообщений для их правильного отображения и функционирования, и ваш цикл блокирует эту рассылку сообщений, перекачивая и обрабатывая сообщения.

Самым «простым» способом действий является встраивание цикла в Application.DoEvents(); вызовы, но это хак и часто приводит к ошибкам, например, когда пользователь дважды нажимает на кнопки, чтобы открыть два окна и т. Д.

Правильный способ - обработать это многопоточным способом, поместить код блокировки в фоновый поток ... или ... поместить форму, которая, как я понимаю, сродни "Пожалуйста, подождите что-то происходит "тип формы, в своем собственном фоновом потоке сам по себе. Любое из этих решений требует некоторой работы для решения проблем с потоками.

Итак, сначала проверьте, работает ли DoEvents для вас, но обязательно попробуйте щелкнуть формы, закрыть форму и т. Д., Чтобы в дальнейшем не возникали странные ошибки.

2 голосов
/ 18 декабря 2009

Если вы уже использовали BackgroundWorker, что с ним не работает ??

        backgroundWorker.WorkerReportsProgress = true;

        backgroundWorker.DoWork += (newSender, newE) =>
        {
            while (!this.ourCC.Connected)
            {
                this.ourCC.InitializeConnection();

                if (!this.ourCC.Connected)
                {
                    backgroundWorker.ReportProgress(0, true);
                }
            }
        };

        backgroundWorker.ProgressChanged += (newSender, newE) =>
        {
            if (!ourECF.Visible)
            {
                ourECF.Show();
            }
        };

        backgroundWorker.RunWorkerCompleted += (newSender, newE) =>
        {
            ourECF.Dispose();
        };

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