1

我是 C# 新手,并试图弄清楚如何从另一个类中编辑表单。表单是由默认的 VS 方法创建的,如下所示:

static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}

我在 Form1.cs 文件中创建了一个方法,作为测试如何更新 Form1 中的 label1 字段。这是方法:

public void UpdateLabel(string state = "Changed Text")
{
  label1.Text = state;
}

我遇到的问题是 Application.Run 命令不提供 Form1 类型的命名对象。所以当我想从 Program.cs 触发 UpdateLabel 方法时,像这样:

XXX.UpdateLabel();

我没有目标对象来访问表单。如果我手动创建表单,那么我相信这会正常工作:

Form1 myForm = new Form1();
myForm.UpdateLabel();

使用 Windows 窗体应用程序提供的 Application.Run(Form1),我如何访问正在创建的窗体对象?另外,这是我应该针对此类问题采取的方法,还是有更好的方法?

4

4 回答 4

2

好吧,你可以用这种方式整合你的最后一个例子......

static void Main() 
{ 
  Application.EnableVisualStyles(); 
  Application.SetCompatibleTextRenderingDefault(false); 
  Form1 myForm = new Form1();
  myForm.UpdateLabel();
  Application.Run(myForm); 
} 

但是让我问您:为什么您的逻辑要求在 Form1 构造函数之外执行此操作?

public Form1()
{
    InitializeComponents();
    label1.Text = "Changed Text";
}

编辑:按照下面的评论,我认为你应该做这样的事情:

MyApplicationCode appCode;

public Form1()
{
    InitializeComponents();
    appCode = new MyApplicationCode();

    this.Text = appCode.GetFormText();
    label1.Text = appCode.GetLabelText();
    cmdSave.Enabled = appCode.UserHasSavePermission();
    ...... // and so on for other decisions on 

}
于 2012-10-15T14:15:09.677 回答
2

您可以通过以下方式解决眼前的问题:

Form1 form = new Form1());

form.UpdateLabel();

Application.Run(form);

至于第二个问题,这实际上取决于您最终要达到的目标。

于 2012-10-15T14:16:48.113 回答
1

因此,您有一些相当复杂的逻辑用于确定表单中某些控件的初始值。由于该逻辑的复杂性,您更愿意从定义中提取该代码Form1并将其移至另一个类。到目前为止一切都很好。

您可以创建一些其他类,Form1 使用该类,并让它为Form1. 而不是有一些其他的类有-a Form1(这将是把你的代码放入的效果MainForm1应该有那个其他的类。

实现这一点相当简单。您创建另一个类,给它一个返回字符串的实例或静态方法。 Form1要么调用静态方法,要么创建类的实例并调用实例方法。然后它根据该方法的结果设置标签。

于 2012-10-15T14:40:11.920 回答
0

Application.Run 通常用于启动 WinForms 应用程序,直到该应用程序关闭为止。您的 Program.cs 类的什么函数应该调用 UpdateLabel?您的应用程序是否使用标签值参数从外部启动?

于 2012-10-15T14:15:19.783 回答