Вложение формы в элемент управления - каковы некоторые конкретные причины? [Дубликат]

В дополнение к вызовам функций * args и ** kwargs полезны в иерархиях классов, а также избегают писать метод __init__ в Python. Подобное использование можно увидеть в таких системах, как код Django.

Например,

def __init__(self, *args, **kwargs):
    for attribute_name, value in zip(self._expected_attributes, args):
        setattr(self, attribute_name, value)
        if kwargs.has_key(attribute_name):
            kwargs.pop(attribute_name)

    for attribute_name in kwargs.viewkeys():
        setattr(self, attribute_name, kwargs[attribute_name])

Подкласс может быть

class RetailItem(Item):
    _expected_attributes = Item._expected_attributes + ['name', 'price', 'category', 'country_of_origin']

class FoodItem(RetailItem):
    _expected_attributes = RetailItem._expected_attributes +  ['expiry_date']

Затем подкласс создается как

food_item = FoodItem(name = 'Jam', 
                     price = 12.0, 
                     category = 'Foods', 
                     country_of_origin = 'US', 
                     expiry_date = datetime.datetime.now())

Кроме того, подкласс с новым атрибутом, который имеет смысл только для этого экземпляра подкласса, может вызвать базовый класс __init__, чтобы отключить настройку атрибутов. Это делается через * args и ** kwargs. kwargs в основном используется для чтения кода с использованием именованных аргументов. Например,

class ElectronicAccessories(RetailItem):
    _expected_attributes = RetailItem._expected_attributes +  ['specifications']
    # Depend on args and kwargs to populate the data as needed.
    def __init__(self, specifications = None, *args, **kwargs):
        self.specifications = specifications  # Rest of attributes will make sense to parent class.
        super(ElectronicAccessories, self).__init__(*args, **kwargs)

, который может быть установлен как

usb_key = ElectronicAccessories(name = 'Sandisk', 
                                price = '$6.00', 
                                category = 'Electronics',
                                country_of_origin = 'CN',
                                specifications = '4GB USB 2.0/USB 3.0')

. Полный код здесь здесь

46
задан Arlen Beiler 19 February 2010 в 21:29
поделиться

4 ответа

Постарайтесь просто:

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

Формы Windows - это контейнер для элементов управления, включая пользовательские элементы управления. Хотя он содержит много похожих атрибутов, как пользовательский элемент управления, основной целью является управление элементами управления.

47
ответ дан Bill Martin 24 August 2018 в 05:36
поделиться
  • 1
    Может ли пользователь контролировать хост (содержать) другие пользовательские элементы управления? – Robert Niestroj 30 April 2012 в 14:54
  • 2
    @RobertNiestroj да они могут. – LxL 2 January 2014 в 19:43

Они имеют лот , они оба получены из ContainerControl. Однако UserControl предназначен для дочернего окна, его необходимо разместить в контейнере. Форма была разработана как окно верхнего уровня без родителя.

Фактически вы можете превратить форму в дочернее окно, установив для свойства TopLevel значение false:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        var child = new Form2();
        child.TopLevel = false;
        child.Location = new Point(10, 5);
        child.Size = new Size(100, 100);
        child.BackColor = Color.Yellow;
        child.FormBorderStyle = FormBorderStyle.None;
        child.Visible = true;
        this.Controls.Add(child);
    }
}
18
ответ дан Hans Passant 24 August 2018 в 05:36
поделиться
  • 1
    Но вы действительно должны избегать этого, ИМО. :) – Dave Markle 20 February 2010 в 02:57
  • 2
    Существует небольшая часть памяти, которую вы будете использовать бесполезно, очень маленькие арахисы по сравнению со стоимостью класса Control и особенно собственного окна. Было бы очень легко Microsoft не раскрывать свойство TopLevel. Эта функция просто неясна, используя ее просто отлично. – Hans Passant 2 August 2016 в 10:08
  • 3
    Думаю, я говорил с точки зрения ясности и композиции кода. Конечно, вы можете сделать это, и, конечно же, это поддерживается, но я думаю, что мой смысл состоять в том, чтобы не принять этот хороший пример в качестве шаблона проектирования :) – Dave Markle 2 August 2016 в 12:10

Форма окна представляет собой контейнер для пользовательских элементов управления.

4
ответ дан Ikke 24 August 2018 в 05:36
поделиться
  • 1
    так это пользовательский контроль! – Dave Markle 19 February 2010 в 21:34
  • 2
    как вы помещаете форму в пользовательский элемент управления !? – Fredou 19 February 2010 в 21:35
  • 3
    вы не можете, но вы можете установить пользовательский элемент управления в пользовательский элемент управления. – Dave Markle 19 February 2010 в 21:35
  • 4
    @Dave - На самом деле. Смотрите мой пост. – Hans Passant 19 February 2010 в 21:40

Самое большое различие - form.show дает другое окно, в то время как usercontrol не имеет функции, как всплытие без родителя. Остальные вещи одинаковы для обоих элементов управления, таких как beind, полученных из Scrollablecontrol.

1
ответ дан sunnytyra 24 August 2018 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: