以编程方式添加的文本框未显示

时间:2017-10-05 14:54:23

标签: c# winforms user-interface controls

我在WinForms VS15使用C#

我根据用户在TextBox中选择的值动态地将LabelForm添加到我的ComboBox(实质上这会查找一个值)在数据集合中告诉我的UI需要什么控件。

当我尝试生成控件时,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 个答案:

答案 0 :(得分:1)

不幸的是,问题似乎只是dX不足以防止文本框隐藏在标签下面,我忘了标签没有透明背景。

当我在场时:我删除了多余的List<Pair<<>>;添加了对基于TextBox大小动态调整Label位置的支持;并将其分成两个独立的循环,所以我的代码现在看起来如下,并且工作正常:

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

    }

感谢所有帮助过的人!