создать пользовательский объект (комбинация двух объектов) - PullRequest
1 голос
/ 01 февраля 2012

Здравствуйте, создание пользовательского объекта может быть широко опубликованной темой, но мой недостаток навыков кодирования оказывается проблематичным в реальной реализации того, что я пытаюсь сделать.

В двух словах я добавляю элементы управления во время выполнения в 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();
        }

возможно, самый лучший ответ - просто добавить сюда текстовую метку и определить несколько установленных координат для ее размещения. дайте мне знать, что вы думаете.

если вам нужен нестандартный элемент управления, предоставьте мне какой-нибудь ресурс или пример - я был бы признателен.

1 Ответ

1 голос
/ 01 февраля 2012

Вот пользовательский элемент управления, который может сделать это: Вам просто нужно установить 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);
    }
...