我在一个非静态MainForm类中有一个非静态属性:
public string SelectedProfile
{
get { return (string)cbxProfiles.SelectedItem; }
set { cbxProfiles.SelectedItem = value; }
}我想从另一个非静态类中获取该属性的值。使用MainForm.SelectedProfile会给出一个错误,提示“非静态字段、方法或属性需要一个对象引用”。
通常我会通过让SelectedProfile成为静态的来解决这个问题,但是我不能,因为cbxProfiles (一个ComboBox控件)不能成为静态的。
那么,如何在不使其成为静态的情况下访问属性值呢?
发布于 2015-03-08 00:57:18
您可以像往常一样访问非静态成员:使用对对象实例的引用。
因此,无论您希望哪个代码能够使用该属性,都需要向它传递一个对MainForm对象的引用。
发布于 2015-03-08 00:57:04
正如在编译错误中所说的,您需要拥有现有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;发布于 2020-07-27 15:20:47
我参加聚会可能会迟到,但我的解决方案也许有一天会对某个人有所帮助。您可以使用Application.OpenForms[n]...直接访问打开的表单的控件(甚至是私有控件)。
例如,假设您已经创建了一个MainForm,然后创建了一个comboBox,使其位于MainForm =>选项卡(名为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视图(视图菜单=> Other Windows => Document Outline)可能会对您有所帮助,因为您可能忽略了中间的一些透明容器。
谨慎使用它。例如,如果尚未创建任何引用控件的句柄,则可能会看到运行时异常。
https://stackoverflow.com/questions/28917420
复制相似问题