2015-07-05 135 views
0

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

enter image description here

填写表格,然后点击“确定”后,第二种形式添加了新的配置文件,并更新了第一种形式的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)
+0

更好的方法是让ManagerTools处理中性数据而不处理控件。简短的解决方案是将此逻辑移至ShowDialog()调用之后。 –

回答

0

我试图实现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 
     } 
    } 
} 

另外,控制ELE ment的(ListViewControl)修饰符应该设置为Public或Internal。否则,你会得到一个错误。

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

你可以将您的ProfilesListView在Form2中的属性修改器设置为Public内部它是私有的默认),那么你可以像这样访问窗体2的ProfilesListView:Form2.ProfilesListView

例如:

ProfilesList.Refresh(Form2.ProfilesListView); 

你的错误是:你正在创建一个新当您使用RefreshWiFiProfiles()方法时,形成

你应该利用现有的窗体2,例如,如果窗体2为Form1的所有者,此代码的工作:

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

下面是完整的例子:

Form1的声明:

  1. 添加一个列表查看Form1,Set it's 修改器公开并在其中添加一些项目。
  2. 添加按钮显示窗体2
  3. 添加按钮清除窗体2的ListView

Form 1代码:

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窗体2,设置它的修饰符公共,并在其中添加一些项目。
  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(); 
    } 
} 
+0

我不认为我会跟着你。 'ProfilesListView'是第一种形式,我将从第二种形式更新它。我如何制作第一个表单的第二个表单所有者?你能给我一个完整的例子而不是一两行代码吗?像这样[小提琴](http://jsfiddle.net/L22L4bqf/2/)。只需填写块。由于我是初学者,我很难找出答案。我也更新了这个问题。现在应该更清楚了。 – akinuri

+0

我不知道你的代码是否正常工作,因为你显然误解了我的问题。在第二种形式中没有ListView ...我现在找到了一个解决方案。不管怎么说,还是要谢谢你。 – akinuri

+0

我知道,我只是做了一个完整的示例,让你清楚你可以从**父表单**到**子表单**和**另一种方式**。如果你运行我的例子,你会明白, –