我是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),如何访问正在创建的窗体对象?另外,这是我应该为这类问题采取的方法,还是有更好的方法?
答案 0 :(得分: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
}
答案 1 :(得分:2)
您可以通过以下方式解决问题:
Form1 form = new Form1());
form.UpdateLabel();
Application.Run(form);
至于第二个问题,它实际上取决于你最终要达到的目标。
答案 2 :(得分:1)
因此,您有一些相当复杂的逻辑,用于确定表单中某些控件的初始值。由于该逻辑的复杂性,您更愿意从Form1
的定义中提取该代码并将其移至另一个类。到目前为止,这一切都很好。
您可以创建其他类,让Form1
使用该类,并让它为Form1
提供值。而不是让其他类具有Form1
(这会将您的代码放入Main
,Form1
应该有其他类。
实现这一点非常简单。您创建另一个类,为其提供一个返回字符串的实例或静态方法。 Form1
要么调用静态方法,要么创建类的实例并调用实例方法。然后根据该方法的结果设置标签。
答案 3 :(得分:0)
Application.Run通常用于启动WinForms应用程序,直到该应用程序关闭为止。您的Program.cs类的哪些功能应该调用UpdateLabel?您的应用程序是否在外部使用标签值参数启动?