Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация свойства от CollectionBase 
V
    Опции темы
Sergey_New
Дата 13.3.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



Создаю свой MyControl с одним свойством MyButton (коллекция Button).
В дизайнере форм у MyControl в свойстве MyButton в редакторе коллекций добавляю новый Button.
Так хотелось бы, но увы :(
Помогите справиться!

Код

Public Class MyControl
    Inherits Control
    Private m_MyCollection As New MyCollection

    Public Property MyButton() As MyCollection
        Get
            Return m_MyCollection
        End Get
        Set(ByVal Value As MyCollection)
            m_MyCollection = Value
        End Set
    End Property

    Public Sub New()
        'm_MyCollection = New MyCollection(Me)
    End Sub
End Class

Public Class MyCollection
    Inherits CollectionBase

    Dim m_MyControl As MyControl
    'Public Sub New(ByVal owner As MyControl)
    '    m_MyControl = owner
    'End Sub

    Public Sub Add(ByVal newItem As Button)
        Me.List.Add(newItem)
    End Sub
    Default Public Property Item(ByVal index As Integer) As Button
        Get
            Return CType(Me.List(index), Button)
        End Get
        Set(ByVal Value As Button)
            Me.List.Item(index) = Value
        End Set
    End Property
End Class

PM MAIL   Вверх
diadiavova
Дата 13.3.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Честно говоря: проблему не понял. Вот такой код
Код

Public Class MultyButtons
    Dim _buttons As New List(Of Button)
    Public ReadOnly Property Buttons() As List(Of Button)
        Get
            Return _buttons
        End Get
    End Property
End Class

добавляет кнопку в коллекцию, можешь посмотреть в коде, сгенерированном дизайнером. Другой вопрос, если надо, чтобы кнопка в контрол добавлялась, токда ей надо присвоить свойство Parent или добавить её в коллекцию Controls твоего элемента управления. Но в любом случае проблему надо описать подробнее.

Это сообщение отредактировал(а) diadiavova - 13.3.2009, 15:31


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Sergey_New
Дата 13.3.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



Да, нужно добавлять кнопку в контрол в дизайнере.
У меня не получается правильно написать классы MyControl и MyCollection.
В показанном коде кнопка в редакторе коллекций добавляется, но не добавляется в контрол. 
PM MAIL   Вверх
diadiavova
Дата 13.3.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Всё равно данных маловато, реализовать это можно по-разному. Как пример 
Код

Public Class BtnColControl
    Dim _btnCount As Integer
    Public Property ButtonCount() As Integer
        Get
            Return _btnCount
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                Exit Property
            End If
            _btnCount = value
            Me.Controls.Clear()
            For i As Integer = 1 To value
                Dim b As New Button
                b.Top = (i - 1) * b.Height
                Me.Controls.Add(b)
            Next
        End Set
    End Property
    Public ReadOnly Property Buttons() As List(Of Button)
        Get
            Dim btns As New List(Of Button)
            btns.AddRange(From c In Me.Controls Where (TypeOf c Is Button) Select CType(c, Button))
            Return btns
        End Get
    End Property
End Class



Здесь в дизайнере задаёшь свойство ButtonCount и кнопки добавляются в контрол(или удаляются). Коллекция Buttons служит только для редактирования свойств кнопок(а не добавления/удаления).
Тут возможны варианты, но всего не объяснишь(не зная задачу), а универсальные решения требуют много кода.

Это сообщение отредактировал(а) diadiavova - 13.3.2009, 16:18


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 13.3.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Цитата(Sergey_New @  13.3.2009,  18:40 Найти цитируемый пост)
В показанном коде кнопка в редакторе коллекций добавляется, но не добавляется в контрол.

Я понял что ты хочешь. Чтобы не писать много, код MyCollection сюда давай.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 13.3.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(-Mikle- @  13.3.2009,  21:47 Найти цитируемый пост)
Я понял что ты хочешь.

Таки есть на форуме телепаты smile


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 13.3.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Ну тык... с 2003 года тренируюсь  smile 


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Sergey_New
Дата 14.3.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



Цитата(-Mikle- @  13.3.2009,  22:47 Найти цитируемый пост)
Чтобы не писать много, код MyCollection сюда давай. 


Так он же в первом посте показан!?

PM MAIL   Вверх
-Mikle-
Дата 14.3.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Цитата(Sergey_New @  14.3.2009,  11:03 Найти цитируемый пост)
Так он же в первом посте показан

ой, не заметил  smile 

примерно так:
Код

    Public Class MyCollection
        Inherits CollectionBase

        Dim _owner As Control

        Public Sub New(ByVal owner As Control)
            _owner = owner
        End Sub

        Protected Overrides Sub OnClearComplete()
            MyBase.OnClearComplete()
            If Not (_owner Is Nothing) Then _
                _owner.Controls.Clear()
        End Sub
        Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
            MyBase.OnInsertComplete(index, value)
            If Not (_owner Is Nothing) Then _
                _owner.Controls.Add(value)
        End Sub
        Protected Overrides Sub OnRemoveComplete(ByVal index As Integer, ByVal value As Object)
            MyBase.OnRemoveComplete(index, value)
            If Not (_owner Is Nothing) Then _
                _owner.Controls.Remove(value)
        End Sub

        Default Public Property Item(ByVal index As Integer) As Button
            Get
                Return CType(Me.List(index), Button)
            End Get
            Set(ByVal Value As Button)
                Me.List.Item(index) = Value
            End Set
        End Property
    End Class




--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Sergey_New
Дата 14.3.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



-Mikle-, спасибо!
Кнопки вставляются. Для полного счастья не хватает, чтобы в редакторе коллекций отбражались ранее вставленные кнопки. При вставке они видны, но после пропадают.
PM MAIL   Вверх
-Mikle-
Дата 14.3.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Там само свойство MyButton надо пометить каким-то атрибутом, не помню, точно. Он говорит студии о том, как надо сериализовывать это свуойство в код. Помоему из-за этого все... Позже посмотрю....


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 14.3.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

Попробуй этот атрибут, вроде он


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 14.3.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Еще, наверное, надо спрятать от сериализации свойство Controls:

Код

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property Buttons() As MyCollection
        Get
            Return ctls
        End Get
    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
    Public Overloads ReadOnly Property Controls() As ControlCollection
        Get
            Return MyBase.Controls
        End Get
    End Property




--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Sergey_New
Дата 14.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 30.12.2007

Репутация: нет
Всего: нет



Цитата(-Mikle- @  14.3.2009,  16:27 Найти цитируемый пост)
Еще, наверное, надо спрятать от сериализации свойство Controls:

После этого установленные кнопки удаляются  :(

PM MAIL   Вверх
-Mikle-
Дата 14.3.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Цитата(Sergey_New @  14.3.2009,  20:18 Найти цитируемый пост)
После этого установленные кнопки удаляются  

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

Далее, какой-то трабл связанный с CollectionBase. Я не стал разбираться в чем именно, просто взял другой класс-родитель.
Вот полностью рабочий вариант:

Код

Public Class UserControl1
    Dim ctls As MyCollection

    Public Sub New()
        InitializeComponent()

        ' Добавьте все инициализирующие действия после вызова InitializeComponent().
        ctls = New MyCollection(Me)
    End Sub

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property Buttons() As MyCollection
        Get
            Return ctls
        End Get
    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    Public Overloads ReadOnly Property Controls() As ControlCollection
        Get
            Return MyBase.Controls
        End Get
    End Property
End Class

Public Class MyCollection
    Inherits System.Collections.ObjectModel.Collection(Of Button)

    Dim _owner As Control

    Public Sub New(ByVal owner As Control)
        If (owner Is Nothing) Then Throw New ArgumentNullException("owner")
        _owner = owner
    End Sub

    Protected Overrides Sub InsertItem(ByVal index As Integer, ByVal item As System.Windows.Forms.Button)
        MyBase.InsertItem(index, item)
        _owner.Controls.Add(item)
    End Sub

    Protected Overrides Sub RemoveItem(ByVal index As Integer)
        MyBase.RemoveItem(index)
        _owner.Controls.RemoveAt(index)
    End Sub

    Protected Overrides Sub ClearItems()
        MyBase.ClearItems()
        _owner.Controls.Clear()
    End Sub
End Class





--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.2081 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.