【问题标题】:Modifying a form object created by application.run(form1)修改由 application.run(form1) 创建的表单对象
【发布时间】:2012-10-15 22:54:31
【问题描述】:

我是 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),我如何访问正在创建的窗体对象?另外,这是我应该针对这类问题采取的方法,还是有更好的方法?

【问题讨论】:

  • 您尝试从哪个其他类访问 Form1 实例?

标签: c#


【解决方案1】:

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

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";
}

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

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 

}

【讨论】:

  • 目前我有一个我编写的程序版本,我刚刚在 form1.cs 文件中编写了所有功能代码。我想分离出不使用表单的代码部分,以便更容易维护和构建。我看到了一些方法来做到这一点: 1. 采用我最初的帖子中的方法,即从另一个类(fBook)控制 form1。 2. 让 form1 创建 fBook 的副本并调用其方法,这将返回值以更新 form1。 3. 让 program.cs 创建每个类的对象,然后以某种方式从那里引导事物。想法?
  • @Ben 您的第二种方法将是最佳选择。您不想将此类代码放入您的 Main 方法中。
  • 我同意服务。特别是如果您从不需要表单的表单中取出代码,那么它不应该需要对表单的引用。一般来说,如果表单正在处理其他数据(例如处理输入以创建输出),那么最好从表单本身完成,调用单独的库、类或任何适当的东西。
  • @Servy,绝对正确,Form1 应该在一个知道导致 Form1 更改的条件、配置或其他内容的类上更改其内容/外观调用方法。所有东西都塞在那里,Form1 向这个类的一个实例询问如何重新配置​​自己。
【解决方案2】:

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

Form1 form = new Form1());

form.UpdateLabel();

Application.Run(form);

至于第二个问题,这真的取决于你最终想要达到的目标。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多