为什么我不能在主程序中与表单对象进行交互?

时间:2017-10-06 17:55:06

标签: c# winforms

这应该非常简单,但我很难看到任何结果。

我有以下表单代码:

//Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NotepadRW
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected TextBox textReadInfo;
        public void SetReadInfo(String str)
        {
            txtReadInfo.Text = str;
        }
    }
}

我还有以下程序代码:

//Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NotepadRW
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            Application.Run(form1);

            form1.SetReadInfo("Hi");

        }
    }
}

结果如下:

Blank Form

为什么不显示我提供的字符串?我不能正确理解程序如何使用Windows窗体?当调用Form1的新实例时,Program.cs的Main()方法的执行是否会停止?

注意:我已尝试使用文本框和富文本框。相同的结果。

额外点数: 我是否正确地进行了封装?我打算将文本框修改为可公开访问(这将起作用),但我认为这将是&#34;正确的&#34;这样做的方法。

2 个答案:

答案 0 :(得分:4)

虽然从the documentation开始并不明显,Application.Run(Form)方法会阻止。您可以从以下引用中推断出这一点:

  

在返回此方法之前,将调用Form类的Dispose方法。

这意味着表单将完成它的工作,并且必须在Run返回之前完成它。即,它阻止。

您可以通过切换订单来完成您想要的任务。而不是

Form1 form1 = new Form1();
Application.Run(form1);
form1.SetReadInfo("Hi");

Form1 form1 = new Form1();
form1.SetReadInfo("Hi");
Application.Run(form1);

答案 1 :(得分:1)

您不应该公开您的文本框,否则您可能会遇到跨线程执行异常。

您的代码无法正常工作的原因是您在主线程上运行表单,因此Application.Run()之后的任何内容都不会被执行。您可以在单独的线程上运行表单。

Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();

            System.Threading.Thread workerThread = new System.Threading.Thread(() => Application.Run(form));

            workerThread.Start();

            form.SetReadInfo("Hello");