从 Form2 访问 Form1 控件
Access Form1 control from Form2
在我的应用程序中,我有两种形式(见下图)。单击 "Add" 按钮显示第二个 "Add wireless network" 表单。
填写表格并点击 "OK" 后,第二个表格添加新配置文件并更新第一个表格中的 wifi 网络配置文件。第一种形式有一个 RefreshProfiles
函数,我在第二种形式中调用它:
((MainForm)this.Owner).RefreshWiFiProfiles();
"Add" 按钮的代码是这样的:
private void AddButton_Click(object sender, EventArgs e)
{
NewNetworkForm newNetworkForm = new NewNetworkForm();
newNetworkForm.Owner = this;
newNetworkForm.ShowDialog();
}
此设置工作正常,但由于随着我添加新内容行数增加,我想拆分代码。所以我创建了一个 class 来包含一些函数。
namespace WirelessNetworkManager
{
public class Tools
{
public static void RefreshWiFiProfiles(ListView ListViewControl)
{
// clear old list
ListViewControl.Items.Clear();
// update it
}
}
}
我用第一种形式调用方法:
Tools.RefreshWiFiProfiles(ProfilesListView);
它工作正常。问题是,因为我也需要从第二种形式更新配置文件列表,所以我需要在 NewNetworkForm
中调用它。我可以访问并传递 MainForm
中的 ProfilesListView
,因为它就在那里。如何将 MainForm
中的控件传递给 NewNetworkForm
中的方法并修改它?还是有更好的方法来做到这一点?
文件结构
- MainForm.cs (WirelessNetworkManager.MainForm)
- NewNetworkForm.cs (WirelessNetworkManager.NewNetworkForm)
- Tools.cs (WirelessNetworkManager.Tools)
您可以将 Form2 中的 ProfilesListView 的 Modifiers 属性 设置为 Public 或 Internal(默认是私有的)然后你可以像这样访问Form2的ProfilesListView:Form2.ProfilesListView
例如:
ProfilesList.Refresh(Form2.ProfilesListView);
您的错误是:您在使用 RefreshWiFiProfiles() 方法时创建了一个新表单。
您应该访问现有的 Form2,例如,如果 Form2 是 Form1 的所有者,则此代码有效:
Form ownerForm = (Form)this.Owner;
Tools.RefreshWiFiProfiles(ownerForm.ProfilesListView);
完整示例如下:
Form1声明:
- 将 ListView 添加到 Form1,将其 Modifiers 设置为 Public 并在其中添加一些项目。
- 添加一个按钮来显示Form2
- 添加一个按钮来清除Form2 ListView
Form1代码:
public partial class Form1 : Form
{
Form2 form2;
public Form1()
{
InitializeComponent();
}
private void btnShowForm2_Click(object sender, EventArgs e)
{
form2 = new Form2();
form2.Owner = this;
form2.Show();
}
private void btnClearForm2List_Click(object sender, EventArgs e)
{
Tools.RefreshWiFiProfiles(form2.lstViewOfForm2);
}
}
Form2声明:
- 将 ListView 添加到 Form2,将其 Modifiers 设置为 Public 并在其中添加一些项目。
- 添加一个按钮以清除 Form1 ListView
Form2代码:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnClearForm1List_Click(object sender, EventArgs e)
{
Form1 form1 = (Form1)this.Owner;
Tools.RefreshWiFiProfiles(form1.lstViewOfForm1);
}
}
工具声明Class:
public static class Tools
{
public static void RefreshWiFiProfiles(ListView listView)
{
listView.Clear();
}
}
我尝试实施 this. __curious_geek's answer 并且效果很好。
MainForm.cs
namespace WirelessNetworkManager
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void AddButton_Click(object sender, EventArgs e)
{
// passing "this" (MainForm) to the second form
NewNetworkForm newNetworkForm = new NewNetworkForm(this);
newNetworkForm.ShowDialog();
}
}
}
NewNetworkForm.cs
namespace WirelessNetworkManager
{
public partial class NewNetworkForm : Form
{
public NewNetworkForm()
{
InitializeComponent();
}
// a local variable to reference the first form (MainForm)
private MainForm mainForm = null;
// a second overloaded constructor accepting a form
public NewNetworkForm(Form callingForm)
{
// mainForm now refers to the first form (MainForm)
mainForm = callingForm as MainForm;
InitializeComponent();
}
private void OKButton_Click(object sender, EventArgs e)
{
// create wifi profile with user input
// accessing the ListView using this.mainForm
Tools.RefreshWiFiProfiles(this.mainForm.ProfilesListView);
this.Close();
}
}
}
Tools.cs
namespace WirelessNetworkManager
{
public class Tools
{
public static void RefreshWiFiProfiles(ListView ListViewControl)
{
ListViewControl.Items.Clear();
// iterate through wifi profiles and populate ListViewControl
}
}
}
控制元素的 (ListViewControl) 修饰符也应设置为 Public 或内部。否则你会得到一个错误。
'WirelessNetworkManager.MainForm.ProfilesListView' is inaccessible due to its protection level
在我的应用程序中,我有两种形式(见下图)。单击 "Add" 按钮显示第二个 "Add wireless network" 表单。
填写表格并点击 "OK" 后,第二个表格添加新配置文件并更新第一个表格中的 wifi 网络配置文件。第一种形式有一个 RefreshProfiles
函数,我在第二种形式中调用它:
((MainForm)this.Owner).RefreshWiFiProfiles();
"Add" 按钮的代码是这样的:
private void AddButton_Click(object sender, EventArgs e)
{
NewNetworkForm newNetworkForm = new NewNetworkForm();
newNetworkForm.Owner = this;
newNetworkForm.ShowDialog();
}
此设置工作正常,但由于随着我添加新内容行数增加,我想拆分代码。所以我创建了一个 class 来包含一些函数。
namespace WirelessNetworkManager
{
public class Tools
{
public static void RefreshWiFiProfiles(ListView ListViewControl)
{
// clear old list
ListViewControl.Items.Clear();
// update it
}
}
}
我用第一种形式调用方法:
Tools.RefreshWiFiProfiles(ProfilesListView);
它工作正常。问题是,因为我也需要从第二种形式更新配置文件列表,所以我需要在 NewNetworkForm
中调用它。我可以访问并传递 MainForm
中的 ProfilesListView
,因为它就在那里。如何将 MainForm
中的控件传递给 NewNetworkForm
中的方法并修改它?还是有更好的方法来做到这一点?
文件结构
- MainForm.cs (WirelessNetworkManager.MainForm)
- NewNetworkForm.cs (WirelessNetworkManager.NewNetworkForm)
- Tools.cs (WirelessNetworkManager.Tools)
您可以将 Form2 中的 ProfilesListView 的 Modifiers 属性 设置为 Public 或 Internal(默认是私有的)然后你可以像这样访问Form2的ProfilesListView:Form2.ProfilesListView
例如:
ProfilesList.Refresh(Form2.ProfilesListView);
您的错误是:您在使用 RefreshWiFiProfiles() 方法时创建了一个新表单。
您应该访问现有的 Form2,例如,如果 Form2 是 Form1 的所有者,则此代码有效:
Form ownerForm = (Form)this.Owner;
Tools.RefreshWiFiProfiles(ownerForm.ProfilesListView);
完整示例如下:
Form1声明:
- 将 ListView 添加到 Form1,将其 Modifiers 设置为 Public 并在其中添加一些项目。
- 添加一个按钮来显示Form2
- 添加一个按钮来清除Form2 ListView
Form1代码:
public partial class Form1 : Form
{
Form2 form2;
public Form1()
{
InitializeComponent();
}
private void btnShowForm2_Click(object sender, EventArgs e)
{
form2 = new Form2();
form2.Owner = this;
form2.Show();
}
private void btnClearForm2List_Click(object sender, EventArgs e)
{
Tools.RefreshWiFiProfiles(form2.lstViewOfForm2);
}
}
Form2声明:
- 将 ListView 添加到 Form2,将其 Modifiers 设置为 Public 并在其中添加一些项目。
- 添加一个按钮以清除 Form1 ListView
Form2代码:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnClearForm1List_Click(object sender, EventArgs e)
{
Form1 form1 = (Form1)this.Owner;
Tools.RefreshWiFiProfiles(form1.lstViewOfForm1);
}
}
工具声明Class:
public static class Tools
{
public static void RefreshWiFiProfiles(ListView listView)
{
listView.Clear();
}
}
我尝试实施 this. __curious_geek's answer 并且效果很好。
MainForm.cs
namespace WirelessNetworkManager
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void AddButton_Click(object sender, EventArgs e)
{
// passing "this" (MainForm) to the second form
NewNetworkForm newNetworkForm = new NewNetworkForm(this);
newNetworkForm.ShowDialog();
}
}
}
NewNetworkForm.cs
namespace WirelessNetworkManager
{
public partial class NewNetworkForm : Form
{
public NewNetworkForm()
{
InitializeComponent();
}
// a local variable to reference the first form (MainForm)
private MainForm mainForm = null;
// a second overloaded constructor accepting a form
public NewNetworkForm(Form callingForm)
{
// mainForm now refers to the first form (MainForm)
mainForm = callingForm as MainForm;
InitializeComponent();
}
private void OKButton_Click(object sender, EventArgs e)
{
// create wifi profile with user input
// accessing the ListView using this.mainForm
Tools.RefreshWiFiProfiles(this.mainForm.ProfilesListView);
this.Close();
}
}
}
Tools.cs
namespace WirelessNetworkManager
{
public class Tools
{
public static void RefreshWiFiProfiles(ListView ListViewControl)
{
ListViewControl.Items.Clear();
// iterate through wifi profiles and populate ListViewControl
}
}
}
控制元素的 (ListViewControl) 修饰符也应设置为 Public 或内部。否则你会得到一个错误。
'WirelessNetworkManager.MainForm.ProfilesListView' is inaccessible due to its protection level