【问题标题】:Pass control to new WinForm c# [closed]将控制权传递给新的 WinForm c# [关闭]
【发布时间】:2013-06-10 10:49:10
【问题描述】:

有没有办法将控件传递给 winForm 实际上我想要做的是一个搜索表单,这个表单将从不同的表单中请求,并且这个表单的内容将是动态的,尽管我可以将适当的控件传递给我的形式但想不出具体实现

【问题讨论】:

  • 也许您可以创建“搜索表单”作为用户控件,它可以轻松实现为您希望的任何表单上的控件。
  • 为什么要传递不同的控件?您可以将一些整数(枚举)参数传递给 Form 的构造函数,您可以从中决定将哪些控件动态添加到表单中。
  • 无论如何您都无法从其他表单添加控件,因此这种方法是死路一条。在搜索表单中构建多个面板,每个面板都有可能的控件集,并根据传递给搜索表单构造函数的参数决定显示哪些面板。

标签: c# winforms search


【解决方案1】:

如果您要传递给表单的控件是真正动态的,您可以将它们传递给表单的构造函数并将它们添加到其控件集合中。

class SearchForm
{
    public void SearchForm(IEnumerable<Control> contentControls)
    {
        foreach(var contentControl in contentControls)
        {
            this.Controls.Add(contentControl);
        }
    }    
}

但是,如果您只希望表单的客户端能够仅显示某些预定义控件的子集,则最好将一些枚举传递给构造函数并根据其值创建适当的控件。

enum SearchControls
{
    None = 0,
    Search = 1,
    Replace = 1 << 2,
    RecentSearches= 1 << 3,
}

class SearchForm
{
    public void SearchForm(SearchControls searchControls)
    {
        if(searchControls.HasFlag(SearchControls.Search))
            CreateAndAddSearchControl();   
        if(searchControls.HasFlag(SearchControls.Replace))
            CreateAndAddReplaceControl();
        if(searchControls.HasFlag(SearchControls.RecentSearches))
            CreateAndAddRecentSearchesControl();
    }    
}

【讨论】:

    【解决方案2】:

    您可以传递控件,尽管 Windows 窗体的约定是分配属性,而不是使用构造函数参数。

    // Control holding the search form
    public class MySearchControl : UserControl {    ...   }
    
    // Form to read data from the search form
    public class MyFormForReadingSearchControl : Form
    {    
       // Constructor is as normal
    
       public MySearchControl SearchControl { get; set; } 
    }
    
    // Form to send the search data.
    public class MyForForSendingTheSearchControl : Form
    {    
       public MySearchControl SearchControl { get; set; }
    
       protected void searchControl_Click(object sender, EventArgs e)    
       {
          var newForm = new MyFormForReadingSearchControl();
          newForm.SearchControl = this.SearchControl; // Pass via property
          newForm.Show();    
       }
    }
    

    对于SearchControl,创建您需要的各种搜索表单的派生类。定义一些标准属性或方法以通用方式检索数据。

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多