2017-10-05 62 views
1

我正在使用WinFormsVS15C#以编程方式添加未出现的文本框

我动态地添加TextBox S和Label s到我Form基于在ComboBox用户选择的值(基本上是这个样子了在数据采集,告诉我什么样的用户界面控制它需要一个值)。

当我尝试生成控件时,Label出现,并且布局很好,但是,如果不存在,TextBox是显着的。

我已经试过用MaximumSizeMinimumSize属性来确认它们是否可能会搞乱某些东西,但它似乎没有任何区别。

我使用这样做是下面的代码(我知道使用List<Pair<Label,TextBox>>是非常不必要的,但我觉得它有助于可读性):

private void GenerateControls(string formType) 
    { 
     string[] formParameters = engine.GetFormParameters(formType); 
     if (formParameters == null) return; 
     SplitterPanel panel = splitContainer.Panel1; 
     panel.Controls.Clear(); 
     List<Pair<Label, TextBox>> controlPairs = new List<Pair<Label, TextBox>>(); 
     int tabIndex = 0; 
     Point labelPoint = panel.Location + new Size(20, 20); 
     Size initialOffset = new Size(0, 30); 
     Size horizontalOffset = new Size(40, 0); 
     Size tBoxSize = new Size(40,20); 
     foreach (string parameter in formParameters) 
     { 
      Label label = new Label 
      { 
       Text = parameter, 
       Tag = "Parameter Label", 
       Name = $"lbl{parameter}", 
       Location = (labelPoint += initialOffset) 
      }; 
      TextBox textBox = new TextBox 
      { 
       AcceptsTab = true, 
       TabIndex = tabIndex++, 
       Text = "", 
       Tag = parameter, 
       Name = $"txt{parameter}", 
       MaximumSize = tBoxSize, 
       MinimumSize = tBoxSize, 
       Size = tBoxSize, 
       Location = labelPoint + horizontalOffset 
      }; 
      controlPairs.Add(new Pair<Label, TextBox>(label, textBox)); 
     } 

     foreach (Pair<Label, TextBox> pair in controlPairs) 
     { 
      panel.Controls.Add(pair.First); 
      panel.Controls.Add(pair.Second); 
     } 
    } 

我不相信我的使用Point + Size是这个问题作为Point类覆盖了+运营商,像这样:

Point+

+1

controlPairs有什么意义?只需在第一个循环中添加控件即可。使用调试器查看您的位置信息。 – LarsTech

+0

我在我的问题中说过,我认为它有助于代码的可读性,我知道这是一个很没有意义的构造,一旦我运行了它,它就会被删除。至于位置,我在(20; Y)和(60; Y)的文本框上看到这些标签,除非我错过了某些东西,否则这对我来说看起来很好。 –

+0

'Point'类覆盖'+'运算符,使得'Point + Size = Point'。标签使用相同的方法来计算出他们的位置,他们似乎工作正常。任何其他想法? –

回答

1

不幸的是,我的问题似乎是简单的DX在N没有足够大的值来防止文本框被隐藏在标签下,我忘记了标签没有透明背景。

当我在它的时候:我已经删除了多余的List<Pair<<>>;增加支持根据Label大小动态调整TextBox位置;并分成两个独立的循环,所以我的代码现在看起来如下,工作得很好:

private void GenerateControls(string formType) 
    { 
     string[] formParameters = engine.GetFormParameters(formType); 
     if (formParameters == null) return; 
     SplitterPanel panel = splitContainer.Panel1; 
     panel.Controls.Clear(); 
     int tabIndex = 0; 
     Point labelPoint = panel.Location + new Size(20, 20); 
     Size verticalOffset = new Size(0, 30); 
     Size tBoxSize = new Size(200,20); 
     int maxLabelLength = 0; 
     foreach (string parameter in formParameters) 
     { 
      Label label = new Label 
      { 
       Text = parameter, 
       Tag = "Parameter Label", 
       Name = $"lbl{parameter}", 
       Location = (labelPoint += verticalOffset), 
       AutoSize = true 
      }; 
      panel.Controls.Add(label); 
      if (label.Size.Width > maxLabelLength) 
      { 
       maxLabelLength = label.Size.Width; 
      } 
     } 
     Size horizontalOffset = new Size(maxLabelLength + 30, 0); 
     labelPoint = panel.Location + new Size(20, 20) + horizontalOffset; 
     foreach (string parameter in formParameters) 
     { 
      TextBox textBox = new TextBox 
      { 
       AcceptsTab = true, 
       TabIndex = tabIndex++, 
       Text = "", 
       Tag = parameter, 
       Name = $"txt{parameter}", 
       MaximumSize = tBoxSize, 
       MinimumSize = tBoxSize, 
       Size = tBoxSize, 
       Location = labelPoint += verticalOffset 
      }; 
      panel.Controls.Add(textBox); 
     } 

    } 

谢谢大家谁帮助!

相关问题