【问题标题】:Problem setting Label text on another Form在另一个表单上设置标签文本的问题
【发布时间】:2008-12-02 17:31:02
【问题描述】:

我正在尝试通过增加字体大小来使 Kiosk 应用程序更易于访问。
主窗体上没有问题。
我在用具有相同消息的小表单替换 MessageBoxes(我认为无法增加字体大小)时遇到问题。

这就是我遇到问题的地方。主窗体无法看到错误窗体及其标签来设置文本。我已尝试在错误表单上为私有标签设置属性,但仍然无法正常工作。

如果能提供任何帮助,我将不胜感激。我一直在尝试应用我在阅读来自各种 C# 源的多个线程时学到的知识。

我注意到了两件奇怪的事情:

  1. 在 MainForm 中,当我输入 ErrorForm 时,会弹出 Intellisense 建议代码列表,但变量 LblNotCheckedInBecause 没有出现在列表中。
  2. 编译器错误说明了 LBlNotCheckedInBecause.get 语句的一些内容,在我看来它应该引用 set 语句,因为我正在尝试设置该值。

以下是我认为涉及的代码部分:

来自ErrorForm.Designer.cs:

private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label lblNotCheckedInBecause;

// property I created to try to be able to change the label
public string LblNotCheckedInBecause  
{
    get { return this.lblNotCheckedInBecause.Text; }
    set { this.lblNotCheckedInBecause.Text = value; }
}

来自MainForm.cs:

// this is what I'm trying to replace
MessageBox.Show("You were not checked in because of the following reasons:" + sErrors);

// this line is causing a compiler error
ErrorForm.LblNotCheckInBecause = "You were not checked in because of the following reasons:" + sErrors; 

编译器错误:

错误 1 ​​非静态字段需要对象引用, 方法或属性 'LogisticsKiosk.ErrorForm.LblNotCheckInBecause.get' C:\Documents 和 设置\我的文档\Visual Studio 2005\Projects\LogisticsKiosk\Forms\MainForm.cs 107 17 LogisticsKiosk

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您不能像访问静态的一样访问 ErrorForm。那只是类定义,你需要在ErrorForm的一个实例上设置属性。

    在您的应用程序的某个地方,您创建了一个新的 ErrorForm。您需要获取该变量并在其上设置您的 LblNotCheckedInBecause 属性。

    寻找这样的代码;

    ErrorForm errorFrm = new ErrorForm();
    errorFrm.Show();
    

    如果你有对该变量的引用,那么你可以这样做;

    errorFrm.LblNotCheckedInBecause = "Some Reason";
    

    以下内容不起作用,因为您的属性不是静态的(如果不创建您可能不想做的单例,就无法将其设为静态)

    // Doesn't work
    ErrorForm.LblNotCheckedInBecause = "Some Reason";
    

    【讨论】:

    • 您好 Rob,感谢您的回复,尤其是这么快。它使我能够使代码正常工作。瑞克
    【解决方案2】:

    另外一件需要注意的快速事情:您提到您在以下位置编辑了代码: ErrorForm.Designer.cs.

    我建议将您添加的代码放在 ErrorForm.cs 中。编译器喜欢认为它对 XXXXXX.Designer.cs 拥有专有权利,并且已知会在对文件进行自动编辑时吹走更改。

    【讨论】:

      【解决方案3】:

      您需要在使用前实例化 ErrorForm 类。你不能像静态的那样使用你的表单。

      ErrorForm ef = new ErrorForm();
      ef.LblNotCheckedInBecause   = "Your error text";
      ef.Show();
      

      【讨论】:

        【解决方案4】:

        感谢大家的帮助。实例化表单后,我能够使代码正常工作。有趣的是,Intellisense 花了几分钟才赶上来。

        【讨论】:

          【解决方案5】:

          要始终牢记的一件事是,其他开发人员阅读和理解您的代码是多么容易。 我看到的最好的选择是这个

          ErrorForm 表单 = new ErrorForm(); form.SetErrorLableMessageTo("错误文本"); form.Show();

          这是非常可读的。在构造函数中传递参数并没有显示意图,直到我们去看看构造函数中发生了什么。另外,并非在所有情况下您都想这样做,如果您选择构造函数方式,那么您将受到约束(不是灵活的设计)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-08
            • 2011-02-25
            相关资源
            最近更新 更多