Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个类访问非静态属性_C#_.net_Winforms - Fatal编程技术网

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

C# 如何从另一个类访问非静态属性,c#,.net,winforms,C#,.net,Winforms,我在非静态MainForm类中有一个非静态属性: public string SelectedProfile { get { return (string)cbxProfiles.SelectedItem; } set { cbxProfiles.SelectedItem = value; } } 我想从另一个非静态类获取此属性的值。使用MainForm.SelectedProfile会出现一个错误,提示“非静态字段、方法或属性需要对象引用” 通常我会通过将SelectedPr

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

public string SelectedProfile
{
    get { return (string)cbxProfiles.SelectedItem; }
    set { cbxProfiles.SelectedItem = value; }
}
我想从另一个非静态类获取此属性的值。使用
MainForm.SelectedProfile
会出现一个错误,提示“非静态字段、方法或属性需要对象引用”

通常我会通过将
SelectedProfile
设置为静态来解决这个问题,但我不能,因为cbxProfiles(组合框控件)不能设置为静态


那么,如何访问属性的值而不使其成为静态的呢?

正如编译错误中所说的,您需要对现有的
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;

正如编译错误中所说,您需要对现有的
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;

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


因此,无论您希望哪种代码能够使用该属性,您都需要向它传递一个对
MainForm
对象的引用。

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


因此,无论您希望哪种代码能够使用该属性,您都需要向它传递一个对
MainForm
对象的引用。

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

例如,假设您创建了一个MainForm,然后创建了一个组合框,使其位于MainForm=>Tab(命名为tabControl)=>TabPage(命名为tabPageMain)=>Panel(命名为pnlMain)=>comboBox(命名为cmbs)内。然后,您可以按如下方式访问最后一个控件:
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;
i、 e.您必须遍历从顶级表单到特定控件的路径文档大纲VisualStudio视图(视图菜单=>其他窗口=>文档大纲)可能对您有所帮助,因为您可能忽略了其中的一些透明容器


谨慎使用。例如,如果任何引用控件的句柄尚未创建,您可能会看到运行时异常。我可能会迟到,但我的解决方案可能有一天会帮助其他人。您可以使用
Application.OpenForms[n]
直接访问打开表单的控件(甚至是私有控件)

例如,假设您创建了一个MainForm,然后创建了一个组合框,使其位于MainForm=>Tab(命名为tabControl)=>TabPage(命名为tabPageMain)=>Panel(命名为pnlMain)=>comboBox(命名为cmbs)内。然后,您可以按如下方式访问最后一个控件:
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;
i、 e.您必须遍历从顶级表单到特定控件的路径文档大纲VisualStudio视图(视图菜单=>其他窗口=>文档大纲)可能对您有所帮助,因为您可能忽略了其中的一些透明容器


谨慎使用。例如,如果尚未创建任何引用控件的句柄,则可能会看到运行时异常。您需要
MainForm
类的实例。
我希望从另一个非静态类获取此属性的值。
在创建该类时,将MainForm的引用传递给该类。(
new OtherClass(this)
)您需要一个
MainForm
类的实例。
我想从另一个非静态类获取此属性的值。
在创建该类时,将MainForm的引用传递给它。(
new OtherClass(this)
)注意,上面的代码示例不太可能访问OP想要使用的
MainForm
的实际实例上的给定属性。我不想创建新的
MainForm
,我只想从已经存在的
main表单中的
cbxProfiles
获取
SelectedItem
。我该怎么做?您必须将MainForm的实例传递给需要访问非静态属性的方法。在Peter的评论后编辑答案@Spioner:如何创建
MainForm
并首先显示它?@Otiel我使用Visual Studio提供的默认方式,使用
Application.Run(新的MainForm)
。请注意,上面的代码示例不太可能访问OP想要使用的
MainForm
的实际实例上的给定属性。我不想创建新的
MainForm
,我只想从
MainForm
中的
cbxProfiles
获取已存在的
SelectedItem
。我该怎么做?您必须将MainForm的实例传递给需要访问非静态属性的方法。在Peter的评论后编辑答案@Spioner:如何创建
MainForm
并首先显示它?@Otiel我使用Visual Studio提供的默认方式,使用
Application.Run(新的MainForm)
。如何获取对
MainForm
对象的引用,以及这与Otiel提到的方法有何不同?@Spioner:如果不看到,很难说。这完全取决于代码所在的位置以及它与
MainForm
对象的关系。事实上,很多时候我看到这样一个问题,你真的不想让其他类访问这个属性;相反,另一个类应该实现
MainForm
对象订阅的事件,然后它只访问自己的属性。但是如果没有代码示例,就无法确定。我如何获得对
MainForm
对象的引用,以及这与Otiel提到的方法有何不同?@Spioner:如果没有看到,真的很难说。这完全取决于代码所在的位置以及它与
MainForm
对象的关系。事实上,很多