【问题标题】:Manipulating form text across classes跨类操作表单文本
【发布时间】:2016-01-10 11:50:36
【问题描述】:

我花了很长时间才能让它工作,我觉得它是如此简单......

我有 2 个类,form1.cs 和 logic.cs

在 form1 上,我有一个私有变量“输出”,具有公共属性输出,我可以设置值。我还有一个公共方法来设置 textbox1.Text 的内容(保持 textbox1 私有)。

namespace myNamespace
{
    public partial class Form1 : Form
    {
        private string output;

        public string Output
        {
            get { return output; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                    output += value;
            }
        }

        public void SetTextbox1(string value)
        {
            textbox1.Text = value;
        }
    }
}

在逻辑上,我有一些实例试图更改 form1 上的变量以更新 textbox1

namespace myNamespace
{
    class logic
    {
        public void Info(string imagePath, string mountDir)
        {
            mountDir = "C:\\mount"

            try
            {
                DismImageInfoCollection imageInfo = DismApi.GetImageInfo(mountDir)
                form1.Output = imageInfo.ToString();
                form1.SetTxtOutput(form1.Output);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

我在尝试的最后 2 行中收到错误消息:

An object reference is required for the non-static field, method, or property 'form1.Output'

如果我将输出、SetTxtOutput() 和输出更改为静态,它会报错,因为 textbox1 也不是静态的。

在不将文本框设置为公共并直接操作的情况下,跨类操作文本框文本值的正确方法是什么?

【问题讨论】:

  • 我认为编译器的意思是 form1 被声明为静态的。你能告诉我们form1声明/初始化吗
  • 1 - 你在哪里创建 form1 的实例? 2 - 您发布的 form1 类代码不正确 - 它只显示命名空间元素,然后显示类内容
  • 你是对的 - 我错过了 Form1 的声明。它是从 VS2015 自动生成的(即视觉设计师使用的类)

标签: c# winforms class


【解决方案1】:

您需要将 form1 对象实际传递给逻辑类,即

 //default constructor
 Logic(form1 Form)
 {
     Form.output;
 }

您收到错误的原因是因为 winforms 为每个表单创建了一个新类,并且要访问类的元素而不实例化它,这些元素需要具有 static 关键字。

附带说明,如果您只是创建一个新的 form1 实例 (form1 form = new form1()),这将创建一个新的表单实例,而不是显示的表单。

【讨论】:

  • 我不会将你的变量命名为Form。这很令人困惑。
  • 老实说没关系,我只是工程命名的另一种情况,因为只有一种形式...form1 Form
  • 不仅令人困惑,而且您忽略了接受的naming conventions。一致性很重要。
  • 好吧,公平地说,我只是在自己的项目上工作过,所以我不需要保持一致,但是每当我在做一个更大的项目时,我倾向于使用匈牙利符号更频繁
  • 那行得通。花了一分钟,因为我只看到部分答案,而不是完整的上下文。我将我的 info 方法参数更改为 public static void Info(string imagePath, string mountDir, Form1 f),然后引用 try { f.Output = imageInfo.ToString(); } 等而不是 Form1.Output。在Form1中,调用该方法时,我现在调用logic.Info(GetTxtMountDir(), this);,并且没有编译错误。我现在在 catch (8007007A) 上收到一条不同的错误消息,但我确定这与我正在使用的 dll 有关。
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2020-02-26
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多