Вопросик по контролу

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Вопросик по контролу

Сообщение Alex01 » 13.03.2009 (Пт) 13:21

Написал пользовательский контрол, но хочу его усовершенствовать. Я передаю некоторые свойства в виде строки с разделителями:

Код: Выделить всё
Inherits System.Windows.Forms.UserControl

Dim smT As String = "id,,,0,,;kodcl,Класс.код,50,1,1,like;pname,Наименование,200,1,1,like;" ' Структура таблички
    Public Property myTable() As String
        Get
            myTable = smT
        End Get
        Set(ByVal value As String)
            smT = value
            Invalidate()
        End Set
    End Property



Код: Выделить всё
    Public ReadOnly Property AnalitPriznak() As String
        Get
            AnalitPriznak = aPr ' Где aPr – строка вида value1;value2;
        End Get
    End Property


Потом преобразовываю эту строку в массив.
Вопрос такого плана: как передать (и вообще возможно ли это) контролу массив и вернуть от контрола массив со значениями?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Вопросик по контролу

Сообщение Williams » 13.03.2009 (Пт) 13:31

Я бы на твоем месте приделал класс хранящий значения и подходящую коллекцию
И вы думаете, что вас оставят в живых после прочтения этого поста?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Вопросик по контролу

Сообщение MIT » 13.03.2009 (Пт) 13:37

Да, возможно. Тут довольно сложный подход, реализующийся через внутренний редактор свойств (на подобие редактора коллекций элементов ListView, табов TabControl`а и т.д.). Информации по теме не очень много, но найти вполне реально - ищи по UITypeEditor
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 13.03.2009 (Пт) 14:11

По поводу класса хранящего значения и коллекции нет ли примерчиков?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Вопросик по контролу

Сообщение Williams » 13.03.2009 (Пт) 14:28

Dictionary, List, в зависимости от того, что конкретно требуется.

Класс

Приватные поля

Свойства

Конструктор(ы)

Например:

Код: Выделить всё
Class Customer

private nameValue as string
private addressValue as string
private phoneNumberValue as string

public property Name

Get
Return nameValue
End Get
Set (value as string)
nameValue=Value
End Set
end property


и т.п.

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

Код: Выделить всё
Public Sub New (name as string, address as string)
nameValue = name
addressValue = address
End Sub

Public Sub New (name as string, address as string, phoneNumber as string)
nameValue = name
addressValue = address
phoneNumberValue = phoneNumber

End Sub


Ну и End Class не забыть...

ЗЫ код набил на коленке :)

Будут вопросы, пиши
И вы думаете, что вас оставят в живых после прочтения этого поста?

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 13.03.2009 (Пт) 15:57

Уважаемый Williams, пытаюсь использовать Ваш код, но вот кроме доп. свойств контрола ничего не получил. В идеале мне необходимо передать сформированный многомерный массив созданный на основе структуры.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Вопросик по контролу

Сообщение Williams » 14.03.2009 (Сб) 13:25

Ну вот ты создал класс с твоими данными, дальше юзай к примеру лист: List(Of имя_класса)
Мы ж не знаем что конкретно тебе нужно
И вы думаете, что вас оставят в живых после прочтения этого поста?

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 27.03.2009 (Пт) 11:45

Уважаемые знатоки, есть вопрос.
В контрол пытаюсь передать массив с набором параметров

Код: Выделить всё
        Dim kf(1) As String
        kf(0) = "emp_id"
        kf(1) = "fname"
        AnalitTable1.SQLkeyField = kf


Само свойство контрола описываю так:

Код: Выделить всё
    Dim sKey() As String = Nothing
    Public Property SQLkeyField() As Object
        Get
            SQLkeyField = sKey
        End Get
        Set(ByVal value As Object)
            'Try
            sKey = CType(value, String())
            Invalidate()
        End Set
    End Property


Но при использовании получаю ошибку "Не удалось привести тип объекта "System.String" к типу "System.String[]". "
Что я делаю неверно?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Вопросик по контролу

Сообщение Viper » 27.03.2009 (Пт) 12:28

А что мешает обяъвить тип свойства как String()?
Весь мир матрица, а мы в нем потоки байтов!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопросик по контролу

Сообщение RayShade » 27.03.2009 (Пт) 12:50

Наверное потому что надо было сделать вот так:
Код: Выделить всё
Dim kf As String() = New String() {"emp_id", "fname"}
AnalitTable1.SQLkeyField = kf
I don't understand. Sorry.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Вопросик по контролу

Сообщение Viper » 27.03.2009 (Пт) 13:19

Гм... Хоть так:
Код: Выделить всё
Dim kf(1) As String
kf(0) = "emp_id"
kf(1) = "fname"
AnalitTable1.SQLkeyField = kf
Хоть эдак
Код: Выделить всё
Dim kf As String() = New String() {"emp_id", "fname"}
AnalitTable1.SQLkeyField = kf
а ошибки "Не удалось привести тип объекта "System.String" к типу "System.String[]". " не получаю.
Весь мир матрица, а мы в нем потоки байтов!

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 27.03.2009 (Пт) 13:55

С массивом разобрался, но вот следующая проблема:

Определяю в контроле свойство

Код: Выделить всё
  Structure StructureTable
        Dim Field As String
        Dim Caption As String
        Dim Wight As Integer
    End Structure

    Dim smT() As StructureTable = Nothing
    Public Property myTable() As object
        Get
            myTable = CType(smT, StructureTable())
        End Get
        Set(ByVal value As Object)
            smT = CType(value, StructureTable())
            Invalidate()
        End Set
    End Property


Далее из формы пытаюсь передать свойства

Код: Выделить всё
    Structure StructureTable
        Dim Field As String
        Dim Caption As String
        Dim Wight As Integer
    End Structure

    Private Sub Form1_Invalidated(ByVal sender As Object, ByVal e As System.Windows.Forms.InvalidateEventArgs) Handles Me.Invalidated
        ....
        Dim mt(2) As StructureTable
        mt(0).Field = "emp_id"
        mt(0).Wight = 100
        mt(0).Visible = True
        mt(1).Field = "fname"
        mt(1).Caption = "ФиО"
        mt(1).Wight = 250
       ....


При компиляции вылетает ошибка: "Не удалось привести тип объекта "StructureTable[]" к типу "StructureTable[]"."
Посоветуйте, что я опять делаю неверно?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Вопросик по контролу

Сообщение MIT » 27.03.2009 (Пт) 14:37

Насколько я понял ты для класса делаешь переопределение структуры. Надо просто истользовать одну структуру, определенную в одном конкретном месте, иначе без изворотов присвоить данные таким образом не получиться.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 27.03.2009 (Пт) 14:44

Как это сделать? Определить в контроле как Public Structure StructureTable?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Вопросик по контролу

Сообщение MIT » 27.03.2009 (Пт) 14:48

Как вариант - да.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 27.03.2009 (Пт) 14:49

Спасиб, разобрался! ;)

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Вопросик по контролу

Сообщение 1Steps » 28.03.2009 (Сб) 1:54

Лучше вынеси структуру в отдельный класс.
Удалена за ненадобностью.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Вопросик по контролу

Сообщение MIT » 28.03.2009 (Сб) 10:46

Для контрола - далеко не факт что лучше :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 02.04.2009 (Чт) 7:01

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

Код: Выделить всё
    Private Sub MyControl1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyControl1.DoubleClick
        MsgBox(“!”)
    End Sub

В свойствах контрола событие DoubleClick присутствует, но видимо его еще нужно описать в самом контроле, но как?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Вопросик по контролу

Сообщение Viper » 02.04.2009 (Чт) 7:19

Alex01 писал(а):Уважаемые знатоки, возникла необходимость обработать двойное нажатие по контролу.

Код: Выделить всё
    Private Sub MyControl1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyControl1.DoubleClick
        MsgBox(“!”)
    End Sub

В свойствах контрола событие DoubleClick присутствует, но видимо его еще нужно описать в самом контроле, но как?
Не понял? Если событие присутствует, то что тебе еще надо? Как то вопрос неудачно сформулирован.
Весь мир матрица, а мы в нем потоки байтов!

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 02.04.2009 (Чт) 7:53

Дело в том, что двойной клик по моему контролу почему-то не работает. А событие в свойствах присутствует (аналогично перечню событий win формы)

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 02.04.2009 (Чт) 9:44

Методом «научного тыка» :) разобрался, что DoubleClick действительно работает. Но вот оказывается в чем загвоздка: я в контроле использую DataGrid для отображения данных, и двойное нажатие на DataGrid контрола должно обрабатываться в коде программы.
В контрол добавил следующий код:
Код: Выделить всё
    Public Sub DataGrid_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid.DoubleClick
        SendAnalit()
    End Sub


Теперь не знаю как это свойство отловить в коде программы? Или я на ложном пути?

Alex01
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 24.01.2002 (Чт) 21:59

Re: Вопросик по контролу

Сообщение Alex01 » 02.04.2009 (Чт) 12:19

Разробрался. Мне нехватало

Код: Выделить всё
Public Event DataGridDoubleClick As EventHandler


Всем спасибо


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

    TopList