【问题标题】:How to access a non-static property from another class如何从另一个类访问非静态属性
【发布时间】:2020-07-27 15:26:52
【问题描述】:

我在非静态 MainForm 类中有一个非静态属性:

public string SelectedProfile
{
    get { return (string)cbxProfiles.SelectedItem; }
    set { cbxProfiles.SelectedItem = value; }
}

我想从另一个非静态类中获取此属性的值。使用 MainForm.SelectedProfile 时会出现错误提示“非静态字段、方法或属性需要对象引用”。

通常我会通过将SelectedProfile 设为静态来解决此问题,但我不能,因为 cbxProfiles(ComboBox 控件)无法设为静态。

那么如何在不使其成为静态的情况下访问该属性的值呢?

【问题讨论】:

  • 您需要一个MainForm 类的实例。
  • I would like to get the value of this property, from another non-static class. 在创建该类时,将 MainForm 的引用传递给它。 (new OtherClass(this))

标签: c# .net winforms


【解决方案1】:

您访问非静态成员的方式与始终相同:使用对对象实例的引用。

因此,无论您希望使用该属性的任何代码,都需要将引用传递给MainForm 对象。

【讨论】:

  • 如何获得对MainForm 对象的引用,这与Otiel 提到的方法有何不同?
  • @Spioner:如果没有看到a good, minimal, complete code example,这真的很难说。这完全取决于该代码的位置以及它与MainForm 对象的关系。事实上,很多时候我看到这样的问题,你真的不希望其他类访问该属性;相反,另一个类应该实现MainForm 对象订阅的事件,然后它只访问自己的属性。但是没有代码示例,就无法确定。
【解决方案2】:

正如编译错误中所说,您需要对现有的MainForm 实例进行引用才能对其进行操作。

// You surely do this somewhere in your code
MainForm mainForm = new MainForm();
// ...
// Use the reference to your mainForm to access its public properties
String selectedProfile = mainForm.SelectedProfile;

【讨论】:

  • 请注意,上面的代码示例不太可能访问 OP 想要使用的 MainForm 的实际实例上的给定属性。
  • 我不想创建一个新的MainForm,我只想从已经存在的cbxProfiles 中获取SelectedItem。我该怎么做?
  • 您必须将 MainForm 的实例传递给需要访问非静态属性的方法。
  • 在彼得发表评论后编辑了答案。 @Spioner:你如何创建你的MainForm 并首先展示它?
  • @Otiel 我使用 Visual Studio 提供的默认方式,使用 Application.Run(new MainForm)
【解决方案3】:

我可能会迟到,但我的解决方案有一天可能会帮助某人。您可以使用 Application.OpenForms[n]... 直接访问打开表单的控件(甚至是私有控件)...

例如,假设您创建了一个 MainForm,然后创建了一个组合框,使其位于 MainForm => Tab(命名为 tabControl)=> TabPage(命名为 tabPageMain)=> Panel(命名为 pnlMain)=> ComboBox(命名为cmb 秒)。然后您可以按如下方式访问最后一个控件:

ComboBox combo = Application.OpenForms[0].Controls["tabControl"].Controls["tabPageMain"].Controls["pnlMain"].Controls["cmbSeconds"] as ComboBox;
string SelectedProfile = (string)combo.SelectedItem;

// OR

bool isMaximized = Application.OpenForms[0].WindowState == FormWindowState.Maximized;

即您必须遍历从顶级表单到该特定控件的路径。 Visual Studio 的 文档大纲 视图(视图 菜单 => 其他 Windows => 文档大纲)可能会帮助您这个 bcoz 你可能会忽略中间的一些透明容器。

谨慎使用。例如,如果尚未创建任何引用控件的句柄,您可能会看到运行时异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多