2016-09-08 3 views
2

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

Label lb = new Label(); 
Form frm = new Form(); 
lb.Left = 100; 
lb.Top = 44; 
frm.Controls.Add(lb); 
frm.ShowDialog(); 
System.Threading.Thread.Sleep(2000); 

После ..Sleep (2000) Я хочу, чтобы он закрылся. Я попробовал:

frm.close();frm.dispose();frm.visible = false; 

Заранее благодарен!

+1

'System.Threading.Thread.Sleep (2000); 'начнется ПОСЛЕ того, как вы закроете frm. Перед открытием frm вы должны начать новый поток. И спать, закрывать ... в этой теме –

+0

Лучший способ сделать это в вашем 'frm', если он будет через некоторое время – Pikoh

+0

Я знаю, что могу это сделать с помощью Show(), но мне нужно это с showDialog(). В моей программе Show() сбой системы, но диалог не –

ответ

2

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

public static class Extension 
{ 
    public static async Task CloseAfterDelay(this Form form, int millisecondsDelay) 
    { 
     await Task.Delay(millisecondsDelay); 
     form.Close(); 
    } 
} 

и назовите его , прежде чем вы показать форму

Label lb = new Label(); 
Form frm = new Form(); 
lb.Left = 100; 
lb.Top = 44; 
frm.Controls.Add(lb); 

frm.CloseAfterDelay(2000); 

frm.ShowDialog(); 
+0

Thnx для вашего ответа помогло мне. Я хочу спросить, можете ли вы предоставить мне образец кода, который будет закрыт, только когда я нажму кнопку. Это возможно? –

1

вместо использования frm.ShowDialog(); использования frm.Show();

ShowDialog() будет ждать диалоговое окно, чтобы закрыть затем продолжить код.

Отредактировано:

 Label lb = new Label(); 
     Form frm = new Form(); 
     lb.Left = 100; 
     lb.Top = 44; 
     frm.Controls.Add(lb); 

     frm.Load += delegate (object o, EventArgs args) 
     { 
      Thread thread = new Thread(p => 
      { 
       Thread.Sleep(TimeSpan.FromSeconds(2)); 
       Action action = frm.Close; 
       Invoke(action); 
      }); 
      thread.Start(); 
     }; 
     frm.ShowDialog(); 
+0

Мне действительно нужно это с помощью ShowDialog(), потому что в моей программе метод show сбрасывает его –

+0

Вы должны упомянуть, что в вашем вопросе, что вы пробовали 'Show()' и он сработал. – Bob

1

Чтобы закрыть ваш диалог через какое-то время, вы должны добавить таймер в диалоговом виде, что-то вроде этого:

private void Form2_Load(object sender, EventArgs e) 
{ 
    Timer tim = new Timer(); 
    tim.Interval = 2000; 
    tim.Tick += new EventHandler(tim_Tick); 
    tim.Enabled = true; 
} 

void tim_Tick(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

Вы можете добавить свой таймер в вашем или в конструкторе формы.

+0

Thnx для вашего ответа, это помогло мне. Я хочу спросить, можете ли вы предоставить мне образец кода, который будет закрыт, только когда я нажму кнопку. Это возможно? –

3

Вы можете использовать что-то вроде этого внутри вы формируете класс:

protected override async void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    await Task.Delay(2000); 
    Close(); 
} 

Внутри метода OnLoad запустить задачу, ждать 2000 мс и закрыть форму.

+0

Просто, чтобы уточнить, этот код нуждается в .net 4.5, если я не ошибаюсь – Pikoh

+0

@Pikoh вы правы хотя бы .net 4.5. –

2

Попробуйте следующим образом. Может быть, это не самый подходящий способ. Но я думаю, что это решит проблему:

 Label lb = new Label(); 
     Form frm = new Form(); 

     frm.Shown += Frm_Shown; 

     lb.Left = 100; 
     lb.Top = 44; 
     frm.Controls.Add(lb); 
     var result = frm.ShowDialog(); 

    private void Frm_Shown(object sender, EventArgs e) 
    { 
     var frm = (Form)sender; 
     System.Threading.Thread.Sleep(3000); 
     frm.DialogResult = DialogResult.Cancel; 
     frm.Close(); 
    } 
+0

'System.Threading.Thread.Sleep (3000);' будет работать в основном потоке и сделать приложение неактивным в течение всего времени сна. – user5226582

1

ShowDialog() будет отображать форму как модальный диалог. Это означает, что вызов будет ждать, пока форма не будет закрыта. Это снова означает, что ваш Thread.Sleep() будет выполнен после того, как форма уже была закрыта.

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

for (int i=1; i<40; i++) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(50); 
} 

Вы должны понимать consequences of DoEvents(), когда вы делаете это. ИМХО уборщик подход был бы таймер на форме, как упомянуто @Pikoh

Также обратите внимание на код, который следует

frm.close();frm.dispose();frm.visible = false; 

После Dispose() вы не должны получить доступ к форме больше, потому что он уже разрушен. Возможно, это вызвало крах.

Смежные вопросы