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

时间:2019-02-06 19:40:08

标签: c# winforms dynamic tabcontrol

正如标题所示,我正在寻找在Tab控件内动态创建Tab页面的方法。我刚刚开始学习C#,而我正在制作的应用程序(如下所示)是一个通用的股票价格应用程序,与单个用户输入一样,它的运行情况也很好。我想将其扩展为接受多个输入(amzn-> amzn,msft,mchp)。

截至目前,它可以处理多个用户输入,但是您可能会猜测,如果不使用Tab控件,它将以超快的速度覆盖它们并以数组中的最后一个字符串结尾。

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

基本应用程序表单的图像(无标签实现):

Image of base app

我最大的担心是,我必须进行重写以使其与动态创建的选项卡兼容,但是从我进行的所有谷歌搜索中,我还没有遇到能够达到此目的的解决方案(即使用预先存在的表单内容动态填充)

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

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();
     }
}

该方法似乎只填充最后创建的选项卡,由于某种原因,它会抹去所有其他先前的选项卡。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是将现有应用程序中的内容包装到自定义TabPage或其他UserControl中,然后将其创建/添加到您的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
}

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

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个之后再更新一次小图。