【问题标题】:Adding Custom Controls to a panel programatically with margin使用边距以编程方式将自定义控件添加到面板
【发布时间】:2017-09-29 08:30:37
【问题描述】:

您好,我创建了一个带有关联标签的自定义文本框。 我有一个自定义表格。

在表单上时,如果我从工具箱中拖放自定义文本框并设置它的属性,我可以看到它有效。但是我想做的是当我在我的自定义控件上时,我有一个 TableLayoutPanel(有 3 行) 在行索引 1(中间行)我想以编程方式添加我的自定义控件。

当我这样做时,文本标签在其他地方,然后是文本框。

我的代码和我的问题的图像如下:

我的自定义文本框:

public class MyLbTextBox : TextBox
{       
    #region CustomProperties

    private Label AssociatedLabel = new Label();
    private string _myLbText;

    public string MyTextLabel
    {
        get => _myLbText;
        set
        {              
            _myLbText = value;              
            AssociatedLabel.Text = _myLbText ?? _myBindingField;
            Size s = TextRenderer.MeasureText(AssociatedLabel.Text, AssociatedLabel.Font);
            AssociatedLabel.Location =
                new Point(Location.X - s.Width - AssociatedLabel.Padding.Right, Location.Y);
            var MyMargin = this.Margin;
            MyMargin.Left = 100;
            this.Margin = MyMargin;
        }
    }


    #endregion

    private string _myBindingField;

    public string MyBindingField
    {
        get { return _myBindingField; }
        set
        {
            _myBindingField = value; 

        }
    }

    private MyJoins.MyExpressions _myExpression;

    public MyJoins.MyExpressions MyExpression
    {
        get => _myExpression;
        set => _myExpression = value;
    }

    public MyLbTextBox()
    {
        _myExpression = MyJoins.MyExpressions.Equals;
        ParentChanged += MyLbTextBox_ParentChanged;
        LocationChanged += MyLbTextBox_LocationChanged;
        Disposed += MyLbTextBox_Disposed;
    }

    private void MyLbTextBox_Disposed(object sender, EventArgs e)
    {
        AssociatedLabel.Dispose();
    }

    private void MyLbTextBox_LocationChanged(object sender, EventArgs e)
    {
        Size s = TextRenderer.MeasureText(AssociatedLabel.Text, AssociatedLabel.Font);
        AssociatedLabel.Location =
            new Point(Location.X - s.Width - AssociatedLabel.Padding.Right, Location.Y);
    }

    private void MyLbTextBox_ParentChanged(object sender, EventArgs e)
    {
        AutoAddAssociatedLabel();
    }

    private void AutoAddAssociatedLabel()
    {
        if (Parent == null) return;

        AssociatedLabel.Padding = new Padding(3);

        Size s = TextRenderer.MeasureText(AssociatedLabel.Text, AssociatedLabel.Font);
        AssociatedLabel.Location =
            new Point(Location.X - s.Width - AssociatedLabel.Padding.Right, Location.Y);

        Parent.Controls.Add(AssociatedLabel);
    }
}

顺便说一句,这是我添加控件的方式:

通过属性网格添加我的控件后

这就是我在屏幕上设置它们的方式

private void _mySearchFields_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (_mySearchFields == null) return;
        foreach (var searchField in _mySearchFields)
        {
            if (MySearchFieldsPanel.Contains(searchField.MyControl)) continue;
            MySearchFieldsPanel.Controls.Add(searchField.MyControl, 1, 0);               
        }
        var myHeight = MySearchFieldsPanel.Controls.Cast<Control>().Sum(variable => variable.Height);
        MyBdPanel.RowStyles[1].Height = myHeight + 40;
    }

感谢任何帮助

【问题讨论】:

    标签: c# winforms custom-controls


    【解决方案1】:

    这一行是所有问题的原因:

    Parent.Controls.Add(AssociatedLabel);
    

    如果您正在创建复合控件(复合 = 由多个 真实 控件组成),这不是一个好主意。这将导致您遇到的布局问题等等。

    请考虑:

    1. 利用UserControl 创建合成。
    2. 创建自定义控件(与您一样),但没有更多控件。如果您需要标签 - 在分配一些空间的同时将其绘制为 OnPaint 中的文本:固定 带有边距,可通过某些属性进行调整或使用测量文本进行动态调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多