Открытие WinForm программно в другом коде WinForm - PullRequest
1 голос
/ 28 мая 2010

Счастливая пятница ТАК! Я создаю мульти-WinForm приложение и у меня возникли некоторые проблемы.

У меня есть основная WinForm, которая всегда открыта. Он ежеминутно попадает в базу данных в поисках изменений, и, если есть изменения, он открывает второй WinForm (это может показаться глупым способом сделать что-то, но для моей цели это лучший метод).

Просто вставить следующий код в мой Form1.cs не помогает:

Application.Run(new Form2());

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

Ответы [ 2 ]

8 голосов
/ 28 мая 2010
Form2 form2 = new Form2();
form2.Show();

и для предотвращения открытия тонны форм, возможно:

Form2 form2 = new Form2();
form2.ShowDialog();

@ Комментарий:

A BackgroundWorker используется, чтобы поддерживать текущий поток UI Thread. Он не был разработан для того, чтобы поддерживать счастливую прокачку множества форм. Посмотрите на выполнение вашего интенсивного кода в виде Фонового потока внутри ThreadPool.

1 голос
/ 28 мая 2010

Если вы хотите запустить длинный процесс и показать прогресс пользователю, например, точно так же, как если у вас есть индикатор выполнения или что-то подобное, вы должны использовать BackgroundWorker для сделать работу. Вот простой пример:

public partial class ProgressForm : Form {
    // Assuming you have put all required controls on design...

    // Allowing some properties to be exposed for progress update...
    public properties MaximumProgress { 
        set {
            progressBar1.Maximum = value;
        }
    public properties OverallProgress { 
        set {
            progressBar1.Value = value;
        }
}

public partial class MainForm : Form {
    private BackgroundWorker backgroundWorker1;
    private ProgressForm _pf;

    public MainForm() {
        InitializeComponent();

        backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += backgroundWorker1_DoWork;
        backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
        backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
    }

    // Assuming process starts on Button click.
    private void button1_Click(object sender, EventArgs e) {
        _pf = new ProgressForm();
        _pf.MaximumProgress = number-of-elements-to-treat-returned-by-prevision-or-whatever-else;

        // Launching the background workder thread.
        backgroundWorker1.RunWorkerAsync(); // Triggering the DoWork event.

        // Then showing the progress form.
        _pf.ShowDialog();
    }

    private void backgroundWorker1_DoWork(object sender, EventArgs e) {
        LaunchProcess();
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
        _pf.OverallProgress = e.ProgressPercentage;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, EventArgs e) {
        _pf.Close();
        _pf.Dispose();
    }

    private void LaunchProcess() {
        // Do some work here...
        // Reporting progress somewhere within the processed task
        backgroundWorker1.ReportProgress();
    }
}

Это не компилируемый код, поскольку его цель - проиллюстрировать основную идею.

Теперь, это что-то похожее вы хотите сделать?

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