从 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 中的方法并修改它?还是有更好的方法来做到这一点?

文件结构

您可以将 Form2 中的 ProfilesListView 的 Modifiers 属性 设置为 PublicInternal默认是私有的)然后你可以像这样访问Form2的ProfilesListView:Form2.ProfilesListView

例如:

ProfilesList.Refresh(Form2.ProfilesListView);

您的错误是:您在使用 RefreshWiFiProfiles() 方法时创建了一个新表单

您应该访问现有的 Form2,例如,如果 Form2 是 Form1 的所有者,则此代码有效:

Form ownerForm = (Form)this.Owner;
Tools.RefreshWiFiProfiles(ownerForm.ProfilesListView);

完整示例如下:

Form1声明:

  1. ListView 添加到 Form1,将其 Modifiers 设置为 Public 并在其中添加一些项目。
  2. 添加一个按钮来显示Form2
  3. 添加一个按钮来清除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声明:

  1. ListView 添加到 Form2,将其 Modifiers 设置为 Public 并在其中添加一些项目。
  2. 添加一个按钮以清除 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