创建自定义对象(两个对象的组合)

本文关键字:对象 两个 组合 自定义 创建 | 更新日期: 2023-09-27 18:22:00

hello创建自定义对象可能是一个广泛发布的主题,但我缺乏编码技能,在实际实现我想要做的事情时证明是有问题的。

简而言之,我在运行时在flowpanelLayout中添加控件。现在只是列表框,代码运行良好。我想要一种方法来标记正在添加的列表框,我想不出比使用文本标签更好的方法了。我认为创建某种自定义控件(如果可能的话)会很巧妙,它是一个列表框和一个文本标签,就像一个在另一个上面一样。通过这种方式,我可以在当前代码中添加新的自定义控件,并在一个动作中分配列表框属性和标签文本等。

这就是我在想的,也许还有更好的方法。

我当前的列表视图创建代码:

public void addListView()
        {
            ListView newListView = new ListView();
            newListView.AllowDrop = true;
            newListView.DragDrop += listView_DragDrop;
            newListView.DragEnter += listView_DragEnter;
            newListView.MouseDoubleClick += listView_MouseDoubleClick;
            newListView.MouseDown += listView_MouseDown;
            newListView.DragOver += listView_DragOver;
            newListView.Width = 200;
            newListView.Height = 200;
            newListView.View = View.Tile;
            newListView.MultiSelect = false;
            flowPanel.Controls.Add(newListView);
            numWO++;
            numberofWOLabel.Text = numWO.ToString();
        }

也许真正的最佳答案是在这里添加一个文本标签,并定义一些设置坐标来放置它。让我知道你的想法。

如果要使用自定义控件,请为我提供一些资源或示例-我将不胜感激。

创建自定义对象(两个对象的组合)

这里有一个自定义的用户控件可以做到这一点:您只需要设置TitleLabelText即可设置标题。

[Category("Custom User Controls")]
public class ListBoxWithTitle : ListBox
{
    private Label titleLabel;
    public ListBoxWithTitle()
    {
        this.SizeChanged +=new EventHandler(SizeSet);
        this.LocationChanged +=new EventHandler(LocationSet);
        this.ParentChanged += new EventHandler(ParentSet);
    }
    public string TitleLabelText
    {
        get;
        set;
    }
    //Ensures the Size, Location and Parent have been set before adding text
    bool isSizeSet = false;
    bool isLocationSet = false;
    bool isParentSet = false;
    private void SizeSet(object sender, EventArgs e)
    {
        isSizeSet = true;
        if (isSizeSet && isLocationSet && isParentSet)
        {
            PositionLabel();
        }
    }
    private void LocationSet(object sender, EventArgs e)
    {
        isLocationSet = true;
        if (isSizeSet && isLocationSet && isParentSet)
        {
            PositionLabel();
        }
    }
    private void ParentSet(object sender, EventArgs e)
    {
        isParentSet = true;
        if (isSizeSet && isLocationSet && isParentSet)
        {
            PositionLabel();
        }
    }
    private void PositionLabel()
    {
        //Initializes text label
        titleLabel = new Label();
        //Positions the text 10 pixels below the Listbox.
        titleLabel.Location = new Point(this.Location.X, this.Location.Y + this.Size.Height + 10);
        titleLabel.AutoSize = true;
        titleLabel.Text = TitleLabelText;
        this.Parent.Controls.Add(titleLabel);
    }
}

示例用法:

    public Form1()
    {
        InitializeComponent();
        ListBoxWithTitle newitem = new ListBoxWithTitle();
        newitem.Size = new Size(200, 200);
        newitem.Location = new Point(20, 20);
        newitem.TitleLabelText = "Test";
        this.Controls.Add(newitem);
    }