【问题标题】:Access Form1 control from Form2从 Form2 访问 Form1 控件
【发布时间】:2015-07-05 07:06:14
【问题描述】:

在我的应用程序中,我有两种形式(见下图)。单击“添加”按钮会显示第二个“添加无线网络”表单。

填写表格并单击“确定”后,第二个表格会添加新配置文件并更新第一个表格中的 wifi 网络配置文件。第一种形式有一个RefreshProfiles 函数,我用第二种形式调用它:

((MainForm)this.Owner).RefreshWiFiProfiles();

“添加”按钮的代码是这样的:

private void AddButton_Click(object sender, EventArgs e)
{
    NewNetworkForm newNetworkForm = new NewNetworkForm();
    newNetworkForm.Owner = this;
    newNetworkForm.ShowDialog();
}

此设置运行良好,但由于添加新内容时行数增加,因此我想划分代码。所以我创建了一个类来包含一些函数。

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)

【问题讨论】:

  • 更好的方法是使用 ManagerTools 来处理中性数据而不是控件。简短的解决方案是将这个逻辑移到 ShowDialog() 调用之后。

标签: c# forms arguments controls


【解决方案1】:

您可以将 Form2 中 ProfilesListView 的 Modifiers 属性设置为 PublicInternal默认为 Private >) 然后你可以像这样访问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. Form2中添加一个ListView,将其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);
        }
    }

工具类声明:

public static class Tools
{
    public static void RefreshWiFiProfiles(ListView listView)
    {
        listView.Clear();
    }
}

【讨论】:

  • 我不认为我关注你。 ProfilesListView 是第一种形式,我将从第二种形式更新它。以及如何使第二个表单成为第一个表单的所有者?你能给我一个完整的例子而不是一两行代码吗?像这样fiddle。只需填充块。由于我是初学者,我很难弄清楚。我也更新了这个问题。现在应该更清楚了。
  • 我不知道您的代码是否正常工作,因为显然您误解了我的问题。第二种形式没有ListView……我现在找到了解决办法。还是谢谢。
  • 我知道,我只是做了一个完整的示例,让您清​​楚地知道您可以从 父窗体子窗体其他方式。如果你运行我的例子你就会明白,
【解决方案2】:

我尝试实现 this. __curious_geekanswer 并且效果很好。

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 或 Internal。否则会报错。

'WirelessNetworkManager.MainForm.ProfilesListView' is inaccessible due to its protection level

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多