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
对象的关系。事实上,很多