подкласс управления, который объединяет несколько элементов управления - PullRequest
0 голосов
/ 17 декабря 2010

Я пытаюсь расширить TextBox, чтобы добавить метку слева от него и рассматривать его как один элемент управления, чтобы мне не приходилось отслеживать их размеры, расположение и т. Д.

Я создал класс TextBoxWithLabel, который расширяет элемент управления и имеет поля TextBox и Label, но я не совсем уверен, что делать с onPaint () - нужно ли указывать ему рисовать оба элемента вручную? Если так, то как? Я предполагаю, что унаследованное поведение по умолчанию не идет так далеко, как «проверь, есть ли у меня какие-либо дочерние элементы управления, и если я их сделаю, нарисуй их» ...

Это даже лучший способ сделать это? Ранее у меня был свой класс расширения TextBox и я просто добавил поле Label, но, конечно, он не был добавлен в панель, содержащую TextBoxWithLabel, и поэтому не рисовался.

Любые предложения или тычки в правильном направлении приветствуются.

Спасибо

Alex

Ответы [ 3 ]

6 голосов
/ 17 декабря 2010

Типичным подходом здесь является UserControl, в котором вы помещаете как метку, так и текстовое поле.Хотя это болезненно, вам нужно добавить множество свойств и событий текстового поля в пользовательский элемент управления, чтобы оно хотя бы напоминало текстовое поле.Уродливый шаблонный код.

Еще один способ сделать это - создать собственное текстовое поле, которое проскальзывает в элемент управления меткой родительского элемента.Это полностью ведет себя как TextBox без какой-либо работы.Добавьте новый класс в ваш проект и вставьте код, показанный ниже.Компиляция.Перетащите новый элемент управления из верхней части панели инструментов на форму.Установите в свойстве Description текст, который вы хотите видеть в метке.

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTextBox : TextBox {
    private Label label;
    public MyTextBox() {
        label = new Label();
        label.AutoSize = true;
        label.Font = this.Font;
        label.Location = this.Location;
        label.Resize += new EventHandler(label_Resize);
    }
    protected override void OnParentChanged(EventArgs e) {
        // Keeps label on the same parent as the text box
        base.OnParentChanged(e);
        label.Parent = this.Parent;   // NOTE: no dispose necessary
    }

    private void moveLabel() {
        // Keep label right-aligned to the left of the text box
        label.Location = new Point(this.Left - label.Width - 10, this.Top);
    }
    private void label_Resize(object sender, EventArgs e) {
        moveLabel();
    }
    protected override void OnLocationChanged(EventArgs e) {
        base.OnLocationChanged(e);
        moveLabel();
    }

    public string Description {
        get { return label.Text; }
        set { label.Text = value; }
    }

    public override Font Font {
        get { return base.Font; }
        set { base.Font = label.Font = value; }
    }

}
1 голос
/ 17 декабря 2010

Рассматривали ли вы использование UserControl? Преимущество пользовательского контроля заключается в том, что вы можете легко разместить метку и текстовое поле с правильным относительным позиционированием.

0 голосов
/ 17 декабря 2010
  • Custom Control - Расширение существующего элемента управления
  • User Control - Состав нескольких существующих элементов управления

Выберите кандидата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...