首页 > 解决方案 > 如何在 C# 中使用预先存在的 Windows 窗体在选项卡控件中动态创建选项卡页

问题描述

正如标题所示,我希望在选项卡控件中动态创建选项卡页。我刚刚开始学习 C#,我正在制作的应用程序(如下所示)是一个通用的股票价格应用程序,它与单个用户输入一样工作得很好。我想将其扩展为采用多个输入(amzn --> amzn、msft、mchp)。

截至目前,它处理多个用户输入,但正如您可能猜到的那样,如果不使用选项卡控件,它只是超级快速地覆盖它们并以数组中的最后一个字符串结束。

我希望能够让多个用户输入动态创建新的标签页,该标签页包含与基本表单相同的所有内容,但每个都有不同的输入参数(每个股票代码)。目前我可以用正确的名称创建新的标签页而没有任何问题,它只是用内容填充标签页。我可以让它打印到单个选项卡,但它不会打印到所有选项卡..

基本应用程序表单的图像(无选项卡实现):

基础应用的图片

我最大的担心是我必须进行重写以使其与动态创建的选项卡兼容,但是从我所做的所有谷歌搜索中,我还没有遇到一个完全符合这个标准的解决方案(即动态填充具有预先存在的表单内容)

我尝试将我的表单内容构建在:

private void btnSubmit_Cick(object sender, EventArgs e)
{
     string userInput = txtUserInput.Text;
     char[] delimiters = { ',', '+', ' ', '-', '_', '.' };
     string[] requests = userInput.Split(delimiters);
     foreach(string str in requests)
     {
          string requestString = str;
          var page = new TabPage(str);
            //Add content to page (i.e. page.Controls.Add(_____))
            //by cloning the base form's controls
            //then finally add the page to the tab control
          tabControl1.TabPages.Add(page);
          page.Select();
     }
}

此方法似乎只填充创建的最后一个选项卡,但由于某种原因它会清除所有其他先前的选项卡。

任何帮助是极大的赞赏!

标签: c#winformsdynamictabcontrol

解决方案


一个简单的解决方案是将现有应用程序中的内容包装在 customTabPage或 otherUserControl中,然后将它们创建/添加到您的TabControl. 提供属性以在自定义控件上设置适当的数据:

public class StockDataPanel : TabPage
{
  // have Labels, RichTextBoxes, etc to display the data you need


  public string StockSymbol
  {
    set => _stockSymbolLabel.Text = value;
  }

  // etc for other data you need to give to the control to display
}

在按钮的单击事件处理程序中,创建此新控件的实例并适当地填充数据:

private void Button_Click(s, e)
{
  foreach (string stock in stocks)
  {
    StockDataPanel panel = new StockDataPanel();
    panel.StockSymbol = "AMZN";
    panel.CurrentPrice = 387.98m;
    _tabControl.TabPages.Add(panel);
  }
}

这允许您通过将其包装在自己的控件中来重用您已经完成的大部分工作。如果您想同时设置一些属性(例如,最高价、最低价、当前价格),请提供一个接受所有 3 个参数的方法;然后,您可以在设置完所有 3 个后更新小图一次。


推荐阅读