Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Как создать массив контрола в виде коллекции? Добавлено: 08.04.07 02:59  

Автор вопроса:  Legon

Ответить

  Ответы Всего ответов: 30  

Номер ответа: 16
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #16 Добавлено: 09.04.07 14:08
Я пришел к выводу, что он взял где-то этот кусок кода и сам не знает, как он работает

да неее.. уж больно речь у него грамотно поставлена.. он определенно понимает то, что говорит.. просто недостаточо точно выражает свои мысли...

Ответить

Номер ответа: 17
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #17 Добавлено: 09.04.07 16:27
Мужики, во-первых хочу сказать спасибо, за то, что откликнулись. Во-вторых поизвинятся, так как ЕРОС был прав - я упустил из виду, что свойство ИТЕМ в классе должно быть по умолчанию. После чего долго размышлял (логически) и понял в чем моя ошибка, когда убрал с экрана код самого класса коллекции:


Public Class PicViewCollections
'Add, Item, Remove, Count ...
...
End Class


Public Class PicView

Dim m_PicViewCollections As PicViewCollections

Public ReadOnly Property Items() As PicViewCollections
Get
'Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get

End Class

А при отладке, когда в тестовом проекте я попытался получить количество,

MsgBox(PicView.Items.Count)

Я получил ошибку типа:

Method not found: 'LVItemsCollections testControl1.MListView.get_LVItems()

Так вот, мой бАльшой вопрос (надеюсь сформулирован правильно):
Как мне правильно создать свойство ИТЕМС?
Что он должен вернуть, или как его правильно объявить?

Ответить

Номер ответа: 18
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #18 Добавлено: 09.04.07 16:31
Да, и в свое оправдание хочу сказать, что на ВБ я не новичек, и работал на разные направления.
НО! Я никогда не работал над созданием классов, никогда не создавал свои контролы, И, на .НЕТ я только начинаю переходить. :))

Ответить

Номер ответа: 19
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #19 Добавлено: 09.04.07 16:50
P.S. Еще раз прошу прощения. Так как имена в моем проекте отличаются от имен в примере (только имена), привожу исправленное сообщение об ошибке:


Method not found: 'PicViewCollections MyProject1.PicView.get_Items()

Ответить

Номер ответа: 20
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #20
Добавлено: 09.04.07 19:35
 Legon,
Так а m_PicViewCollections ничему не равно..., это просто пустая переменная, поэтому и Nоthing...

Создай экземпляр класса PicViewCollections и в конструкторе PicView например, приравняй m_PicViewCollections этому экземпляру класса...

P.S ООП с нуля

Ответить

Номер ответа: 21
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #21
Добавлено: 09.04.07 19:40
Public Class PicView

Dim m_PicViewCollections As PicViewCollections

Sub New()
m_PicViewCollections = 'экземпляр(!!!) класса PicViewCollections!
End Sub

Public ReadOnly Property Items() As PicViewCollections
Get
Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get

End Class

Ответить

Номер ответа: 22
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #22
Добавлено: 09.04.07 19:45
Обычно экземпляр класса (по-кр. мере я так делаю) в свойство только для чтения я ложу вывожу из какого-нибудь другого свойства, которое можно записывать, или из конструктора

Public Class PicView

Dim m_PicViewCollections As PicViewCollections

Sub New(e As PicViewCollections)
m_PicViewCollections = e
End Sub

Public ReadOnly Property Items() As PicViewCollections
Get
Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get

End Class

давай, удачи

Ответить

Номер ответа: 23
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #23 Добавлено: 09.04.07 21:50
УУУУААААААУУУУУ! Заработало!!!!!!!
Спасибки!!!!!
Мужики, вы будете смеятся (я например когда писал это мес, смеялся), но у меня возник "ИСЧО" один вопрос (прошу простить за назойливость но кроме вас помочь больше некому). Так вот:
Имея UserControl MPicView и свойство Items типа PicViewCollections у меня через методы, кнопки классно попадают в коллекцию. А как мне зделать так, чтобы они на ЮсерКонтроле отображались и удалялись.
По логике, реализация должна быть заложена в методах самой коллекции, но коллекция то абстрактная, и ни к одному контейнеру не привязана. Значит реализовывать нужно в самом ЮсерКонтроле, но как отследить изменения в коллекции? И как вообще программно добавить кнопку (или любой контрол) на форму?
Я сам уже "замахался"...

Ответить

Номер ответа: 24
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #24 Добавлено: 09.04.07 22:03
Вариант, предложенный -АлександР- лично мне не мовсем нравится.. В его примере, чтобы создать экземпляр класса PicView в конструктор надо передавать экземпляр PicViewCollections, что в общем то не совсем верно, поскольку эта коллекция является внутренней и доступ из вне к ней должен быть закрыт.. А посему предлогаю поступить следующим образом - инициализировать PicViewCollections ВНУТРИ самого класса.. либо в конструкторе либо при объвлении..
Вариант 1:
Public Class PicView

Dim m_PicViewCollections As New PicViewCollections

Вариант 2:
Public Class PicView

Dim m_PicViewCollections As PicViewCollections

Sub New()
m_PicViewCollections = New PicViewCollections
End Sub

в этом случае ты никогда не получишь исключения подобного тому что у тебя было..

Ответить

Номер ответа: 25
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #25 Добавлено: 09.04.07 22:12
По логике, реализация должна быть заложена в методах самой коллекции, но коллекция то абстрактная, и ни к одному контейнеру не привязана. Значит реализовывать нужно в самом ЮсерКонтроле,

Верной дорогой идешь товарисчЪ!! :-)
Реализовать надо именно в UserContol. Сейчас объсню суть, а реализацию оставлю тебе.. сложностей она не должна вызвать..
Итак что мы имеем..
1.Чтобы контролы отображались на UserControl тебе необходимо их добавить в сам UserControl, поскольку он ничего не знает о существовании твоей PicViewCollections.
2. Для этого у него есть коллекция Controls. Работа с ней ничем не отличается отработы с обычной коллекций..
3. Тебе надо в методах твоей PicViewCollections (Аdd,Remove) добавить еще по 1-2 строчке чтобы сопоставить сою коллекцию контролов (Button) с коллекцией UserControl

Ну вот собственно и все...

Ответить

Номер ответа: 26
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #26 Добавлено: 09.04.07 22:15
Сорри за невнимательность.. некорректный вариант был предложен автором а не -АлександР-..

Ответить

Номер ответа: 27
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #27 Добавлено: 09.04.07 23:52
Ну и чтоб ты не мучался.. примерная реализация твоих классов с тестом...
Option Strict Off

''' <summary>
''' VS 2005
''' EROS
''' </summary>
''' <remarks>Example using UserControl and ControlCollection</remarks>
Public Class Form1
    '// Test UserControl
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click

        '// PicView1 & Button1 must be added in form!!!!!

        '// Add 2 buttons
        PicView1.Items.Add(New Button) '//  button without text & location
        PicView1.Items.Add("MyButton", _
                           New Point(50, 50)) '//  button with text & location

        '// Test collection
        Me.Text = PicView1.Items(1).Text

    End Sub

End Class


Public Class PicView
    Inherits UserControl

    Public Sub New()
        '// Initialization
        _Items = New PicViewCollection(Controls)
        Me.Size = New Size(200, 200)
    End Sub

    Private _Items As PicViewCollection
    Public ReadOnly Property Items() As PicViewCollection
        Get
            Return _Items
        End Get
    End Property

    '// Реализация остальных свойств и методов

End Class

Public Class PicViewCollection

    Private _owner As Control.ControlCollection

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

    Public Sub Add(ByVal value As Button)
        _owner.Add(value)
    End Sub

    Public Sub Add(ByVal value As String, _
                   ByVal location As Point)

        Dim _button As New Button

        With _button
            .Text = value
            .Location = location
        End With

        _owner.Add(_button)

    End Sub

    ;Default Public ReadOnly Property Item(ByVal index As Integer) As Button
        Get
            Return _owner.Item(index)
        End Get
    End Property

    '// Дальше переопределяешь нужные методы и свойства

End Class

Ответить

Номер ответа: 28
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #28 Добавлено: 10.04.07 16:08
Извините, что долго не отвечал. (и за небольшой флуд - температура совсем свалила :().
Спасибо вам всем! Все работает! Жаль что мы с разных городов. Очень хотелось бы вас всех увидеть и угостить пивком! (Сорри за еще один флуд).
Знаю, как это смотрится, но у меня последний вопрос (по теме массива контролов). Как им добавить события (допустим КЛИК)?

Ответить

Номер ответа: 29
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #29 Добавлено: 10.04.07 21:23
Как им добавить события (допустим КЛИК)?


Option Strict Off

''' <summary>
''' VS 2005
''' EROS
''' </summary>
''' <remarks>Example using UserControl and ControlCollection</remarks>
Public Class Form1
    '// Test UserControl
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click

        '// PicView1 & Button1 must be added to form!!!!!


        PicView1.Items.Add("MyButton 1", New Point(0, 0))
        PicView1.Items.Add("MyButton 2", New Point(80, 0))
        PicView1.Items.Add("MyButton 3", New Point(0, 30))
        PicView1.Items.Add("MyButton 4", New Point(80, 30))

    End Sub

    Private Sub PicView1_ItemClick(ByVal sender As Object, _
                                   ByVal e As System.EventArgs) _
                                   Handles PicView1.ItemClick

        MessageBox.Show((CType(sender, Button)).Text & " was clicked!", _
                        "vbnet.ru", _
                        MessageBoxButtons.OK, _
                        MessageBoxIcon.Information)
    End Sub

End Class


<System.ComponentModel.DefaultEvent("ItemClick";)> _
Public Class PicView
    Inherits UserControl

    Public Event ItemClick As EventHandler

    Public Sub New()
        '// Initialization

        _Items = New PicViewCollection(Controls, _
                                       AddressOf OnItemClick)
        Me.Size = New Size(200, 200)
    End Sub

    Private _Items As PicViewCollection
    Public ReadOnly Property Items() As PicViewCollection
        Get
            Return _Items
        End Get
    End Property

    Protected Overridable Sub OnItemClick(ByVal sender As System.Object, _
                                          ByVal e As System.EventArgs)
        RaiseEvent ItemClick(sender, e)
    End Sub

End Class

Public Class PicViewCollection

    Private _owner As Control.ControlCollection
    Private _onItemClickDelegate As EventHandler

    Friend Sub New(ByVal owner As Control.ControlCollection, _
                   ByVal OnItemClickDelegate As EventHandler)
        _owner = owner
        _onItemClickDelegate = OnItemClickDelegate
    End Sub

    Public Sub Add(ByVal value As Button)
        AddHandler value.Click, _
                   AddressOf OnItemClick
        _owner.Add(value)
    End Sub

    Public Sub Add(ByVal value As String, _
                   ByVal location As Point)

        Dim _button As New Button

        With _button
            .Text = value
            .Location = location
        End With

        AddHandler _button.Click, _
                   AddressOf OnItemClick

        _owner.Add(_button)

    End Sub

    ;Default Public ReadOnly Property Item(ByVal index As Integer) As Button
        Get
            Return _owner.Item(index)
        End Get
    End Property

    Public Sub RemoveAt(ByVal index As Integer)
        Dim _item As Button = _owner(index)
        RemoveHandler _item.Click, _
                      AddressOf OnItemClick
        _owner.RemoveAt(index)
    End Sub

    Private Sub OnItemClick(ByVal sender As System.Object, _
                            ByVal e As System.EventArgs)
        _onItemClickDelegate.Invoke(sender, e)
    End Sub

End Class

Ответить

Номер ответа: 30
Автор ответа:
 Legon



Вопросов: 4
Ответов: 32
 Профиль | | #30 Добавлено: 11.04.07 20:04
Добрался до компутера, чтобы еще раз поблагодарить всех вас! Все работает! Спасибо!

Думаю, тема закрыта!

oleg_coder@ukr.net

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам