如何从另一个类访问非静态属性

时间:2015-03-07 16:55:00

标签: c# .net winforms

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

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

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

通常我会通过使SelectedProfile静态来解决这个问题,但我不能,因为cbxProfiles(一个ComboBox控件)不能变为静态。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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;

答案 2 :(得分:0)

我可能聚会晚了,但是我的解决方案可能有一天会帮助某人。您可以使用Application.OpenForms[n] ...

直接访问打开的表单的控件(甚至是私有控件)。

例如,假设您创建了一个MainForm,然后创建了一个comboBox,使其位于MainForm中=> Tab(命名为tabControl)=> TabPage(命名为tabPageMain)=>面板(命名为pnlMain)=> ComboBox(命名为cmbSeconds)。然后,您可以按以下方式访问此最后一个控件:

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的 Document Outline 视图( View 菜单=> 其他Windows => Document Outline )可能会帮助您这个bcoz您可能会忽略它们之间的一些透明容器。

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