C# 在另一个WinForm中以编程方式打开WinForm';s代码

C# 在另一个WinForm中以编程方式打开WinForm';s代码,c#,winforms,C#,Winforms,星期五快乐! 我正在构建一个多WinForm应用程序,遇到了一些问题 我有一个始终打开的主WinForm。它每分钟都会访问一个数据库以查找更改,如果有更改,它将打开第二个WinForm(这似乎是一种愚蠢的方法,但就我而言,这是最好的方法) 仅将以下代码粘贴到我的Form1.cs中并不起作用: Application.Run(new Form2()); 你们能给我指一下正确的方向吗?我不知道该转向哪里 Form2 form2 = new Form2(); form2.Show(); 为了防止大

星期五快乐! 我正在构建一个多WinForm应用程序,遇到了一些问题

我有一个始终打开的主WinForm。它每分钟都会访问一个数据库以查找更改,如果有更改,它将打开第二个WinForm(这似乎是一种愚蠢的方法,但就我而言,这是最好的方法)

仅将以下代码粘贴到我的Form1.cs中并不起作用:

Application.Run(new Form2());
你们能给我指一下正确的方向吗?我不知道该转向哪里

Form2 form2 = new Form2();
form2.Show();
为了防止大量表单被打开,可能:

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

@评论:

BackgroundWorker
用于保持您当前的UI线程响应。它的设计并不是为了让多个表单愉快地运行。将密集型代码作为一个应用程序运行

为了防止大量表单被打开,可能:

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

@评论:


BackgroundWorker
用于保持您当前的UI线程响应。它的设计并不是为了让多个表单愉快地运行。将密集型代码作为a中的a来运行。

如果您希望启动一个长流程并向用户显示进度,例如,就像您有一个进度条或类似的东西一样,您应该使用a来完成这项工作。下面是一个简单的例子:

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();
    }
}
这不是一个可编译的代码,因为它的目的是说明主要思想


现在,这与您想做的类似吗?

如果您希望启动一个长流程并向用户显示进度,例如,就像您有一个进度条或类似的东西一样,您应该使用一个来完成这项工作。下面是一个简单的例子:

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();
    }
}
这不是一个可编译的代码,因为它的目的是说明主要思想


现在,这是你想做的事情吗?

@Soo-为什么这是最好的做事方式?好奇的问题。好吧,当我在BackgroundWorker中尝试这个时,新打开的表单会变得没有响应。这有什么办法吗?之所以有两个窗体,是因为第二个winform具有不同的属性(它不能关闭,并且停留在其他窗口的顶部)。Kyle的意思是第一个窗口中的数据库检查代码可以由BackgroundWorker运行,以保持主UI响应。我的错,没有注意到时间戳。@Soo:你是想说第二个无法关闭且位于另一个窗体之上的窗体是在模仿进度窗口或类似的东西吗?@Soo:后台工作线程无法显示窗体。它具有错误的单元状态,并且不泵送消息循环。使用worker收集表单数据,在RunWorkerCompleted事件中创建和填充表单。@Soo-为什么这是最好的方法?好奇的问题。好吧,当我在BackgroundWorker中尝试这个时,新打开的表单会变得没有响应。这有什么办法吗?之所以有两个窗体,是因为第二个winform具有不同的属性(它不能关闭,并且停留在其他窗口的顶部)。Kyle的意思是第一个窗口中的数据库检查代码可以由BackgroundWorker运行,以保持主UI响应。我的错,没有注意到时间戳。@Soo:你是想说第二个无法关闭且位于另一个窗体之上的窗体是在模仿进度窗口或类似的东西吗?@Soo:后台工作线程无法显示窗体。它具有错误的单元状态,并且不泵送消息循环。使用worker收集表单数据,在RunWorkerCompleted事件中创建和填充表单。