2013-05-18 142 views
0

我有一个父窗体然后创建子窗体的程序。在单击子表单中的updateButton后,我想要触发父表单中的searchButton。从子窗体按钮访问父窗体按钮

但是我得到保护的原因错误。我试图设置一切公开只是为了看到,仍然不会为我工作。

错误1 'SalesSystem.SystemForm.searchButton' 不可访问由于 其保护级别SalesSystem \ UpdateForm.cs 111 20 SalesSystem

这是我到目前为止所。

父代码

namespace SalesSystem 
{ 
    public partial class SystemForm : Form 
    { 
     public SystemForm() 
     { 
      InitializeComponent(); 
     }  

     protected void searchButton_Click(object sender, EventArgs e) 
     { 
      //search code 
     } 

     private void updateButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text,   dbdirec, dbfname); 
       upForm.ShowDialog(this); 
      } 
      catch (Exception) 
      { 
       // 
      } 
     } 
    } 

儿童法

namespace SalesSystem 
{ 
    public partial class UpdateForm : Form 
    { 
     public UpdateForm(string selectedPerson, string dbdirec, string dbfname) 
     { 
      InitializeComponent(); 

     } 

     private void updateButton_Click(object sender, EventArgs e) 
     { 
      //do stuff 

      SystemForm parent = (SystemForm)this.Owner; 
      parent.searchButton.PerformClick(); 

      this.Close(); 
     } 
    } 
} 

回答

1

searchButton按钮控制默认情况下,在winform设置为private。你已经说过你把所有东西都设置为公开,但我认为你的意思是你已经把你公布的代码中的所有内容都设置为公开。有几种方法可以解决这个问题。直接修复方法是简单地转到Visual Studio设计器,选择该按钮,并将其Modifier属性设置为internalpublic

然而,似乎你直后,所以我只希望有我的父窗体订阅FormClosing事件形式的关闭您的形式。

UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname); 
upForm.FormClosing += (s, o) => 
     { 
      //your code for what the parent class should do 
     }; 
upForm.ShowDialog(this); 

如果你不关闭的形式,那么你可以创建自己的事件处理程序,你的父窗体订阅。

+0

设置修改内部工作。谢谢。 – mansonitefirefox

0

您应该使用"Model View Controller""Model View Presenter"模式接近这种事情。

每个表单只应显示其内容的用户关注。当涉及响应按钮点击等UI事件时,每个表单(即每个表单"View")都应该简单地引发一个事件,通知控制器/演示者发生了一些事情。然后

控制器/发言人应该适当地响应。然后,将不同形式(例如,您的示例中的父窗体和子窗体)连接在一起的逻辑封装在Controller类中。这种逻辑并不属于任何一种形式。

我写道,演示了一个简单的设计做这样的事情在另一个答案前段时间的例子。而不是复制/粘贴都在这里,我只是给你一个链接:

How to make Form1 label.text change when checkbox on form2 is checked?

你必须向下滚动才能看到我的回答。它与你所做的大致相似;希望它对你有意义!按照说明制作测试应用程序并运行它以查看会发生什么。

1

你有2种选择:

  • 创建您的父表public void search()方法。然后,直接运行搜索代码,而不是访问父窗体上的按钮并调用其单击事件。新方法不绑定到GUI元素,并且从其他表单访问它不成问题。

  • 更好的解决方案是创建一个委托。委托是执行目标,将在运行时分配。父窗体仍然有一个public void search()方法。当它创建子窗体时,它会将该函数的名称作为参数传递。子表单对父表单没有任何了解(与第一种选择是孩子必须知道有一种方法称为search())。当是时候通知谁创建了子表单的时候,代表被调用。这是一个小例子:

    public partial class SystemForm : Form 
    { 
        public delegate void dSearch(); 
    
        public SystemForm() 
        { 
         InitializeComponent(); 
        } 
    
        protected void searchButton_Click(object sender, EventArgs e) 
        { 
         search(); 
        } 
    
        private void search() 
        { 
         //search code 
        } 
    
        private void updateButton_Click(object sender, EventArgs e) 
        { 
         try 
         { 
          UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname, search); 
          upForm.ShowDialog(this); 
         } 
         catch (Exception) 
         { 
          // 
         } 
        } 
    } 
    

而子窗体:

public partial class UpdateForm : Form 
{ 
    private SystemForm.dSearch _target; 

    public UpdateForm(string selectedPerson, string dbdirec, string dbfname, SystemForm.dSearch target) 
    { 
     _target = target; 
     InitializeComponent(); 
    } 

    private void updateButton_Click(object sender, EventArgs e) 
    { 
     //do stuff 
     _target(); 

     this.Close(); 
    } 
} 
0

我累了,可能失去了一些东西,但是这是正确的行为。

您的子窗体不直接从您的父窗体继承。

您的父表单具有受保护的级别,因此只有它和扩展它的类才能访问该方法。

2解决方案:

  1. 更改你的孩子形式:

公共部分类UpdateForm:SYSTEMFORM

  1. 更改方法,以公共

公共无效searchButton_Click (对象发送者,Eve ntArgs E)

0

你可以从你的UpdateForm暴露在搜索事件和订阅此事件在SYSTEMFORM

namespace SalesSystem 
{ 
    public partial class SystemForm : Form 
    { 
     public SystemForm() 
     { 
      InitializeComponent(); 
     }  

     protected void searchButton_Click(object sender, EventArgs e) 
     { 
      //search code 
     } 

     private void updateButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text,   dbdirec, dbfname); 

       upForm.OnSearch += Search;      

       upForm.ShowDialog(this); 
      } 
      catch (Exception) 
      { 
       // 
      } 
     } 

     private void Search(string searchParameter) 
     { 
      .... 
     } 

    } 


namespace SalesSystem 
{ 
    public delegate void SearchEventHandler(string searchParameter); 

    public partial class UpdateForm : Form 
    { 

     public event SearchEventHandler OnSearch; 

     public UpdateForm(string selectedPerson, string dbdirec, string dbfname) 
     { 
      InitializeComponent(); 

     } 

     private void updateButton_Click(object sender, EventArgs e) 
     { 
      //do stuff 

      OnSearch("SearchThis"); 

      this.Close(); 
     } 
    } 
}