Добавление TabPage с копированием контролов с вкладки-матки

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

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

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Добавление TabPage с копированием контролов с вкладки-матки

Сообщение asharky » 21.06.2007 (Чт) 17:56

Исходные:

TabControl с одной вкладкой TabPage, по имени f_tabpageMain, на которой накидано много всяких контролов типа GroupBox, TextBox, etc. Все контролы объединены одним GroupBox под именем f_groupboxMain.

Надо:

При программном добавлении еще одной вкладки, присвоить ей соответствующее имя f_tabpage1 (f_tabpage2, f_tabpage3......f_tabpageN) и скопировать все контролы с вкладки f_tabpageMain, изменив при этом их имена на соответствующие.

Как лучше это сделать? Рекурсия может быть для этой цели подойдёт?

Нюанс в том, что хочется следующего: проектировать и модифицировать контролы на вкладке-матке не программно, а визуально (мышкой то бишь). А при копированни и модификации имён контролов быть уверенным, что все копирования прошли без ошибок.
В культурной столице проститутки берут книгами...

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Re: Добавление TabPage с копированием контролов с вкладки-ма

Сообщение asharky » 23.06.2007 (Сб) 13:41

Ёлы палы :twisted: Нарвался на Проблемы с передачей объектных переменных по значению

Товарищи! Как "порвать" связь между двумя контролами, второй из которых получен присваиванием ему первого? Передача параметров в процедуру по ByVal/ByRef не работает :(
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.06.2007 (Сб) 14:20

Как "порвать" связь между двумя контролами

Нету у тебя двух контролов. Есть один контрол и две ссылки на него.
Читай учебник пока не поймешь, либо формулируй вопрос по другому, иначе так и будешь разговарить сас с собой. ))
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 23.06.2007 (Сб) 15:43

Nord777 писал(а):Нету у тебя двух контролов. Есть один контрол и две ссылки на него.
Это я понимаю.

Nord777 писал(а):Читай учебник пока не поймешь


Да я вроде как не ленюсь читать, но там только констатация проблемы, а решения нет :(

Nord777 писал(а):...либо формулируй вопрос по другому, иначе так и будешь разговарить сам с собой. ))
Хорошо. Попробую :)

Товариши! Как программно сделать копию имеющегося контрола?
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.06.2007 (Сб) 16:34

Вручную.
Создаешь новый контрол и копируешь нужные тебе свойства.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 23.06.2007 (Сб) 16:51

Nord777 писал(а):Вручную.
Создаешь новый контрол и копируешь нужные тебе свойства.
Это годится если на этапе написания клонирования контрола с ним полная ясность имеется. Но это не так: входящие контролы создаются визуально и каждый раз лезть потом в код и пририсовывать там ещё десяток строчек - не есть правильно.

В первом посте обозначено же условие :?
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.06.2007 (Сб) 18:11

В первом посте обозначено же условие

Это не условие. Это "сумбурная каша мыслей". ))

Если я правильно тебя понял, то ты хочешь в рантайме модифицировать контролы на форме(или панели).
Тебе надо менять только их позицию и принадлежность к родителю?
Если так, то в чем проблема?
У всех контролов есть свойста Location, Parent, Name.
Все контролы перебираются
For Each Ctrl As Control In Panel1.Controls
...
Next
Проблема то в чем?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 23.06.2007 (Сб) 19:26

Nord777 писал(а):Это не условие. Это "сумбурная каша мыслей". ))
Учусь, понимаешь. Постепенно более внятные будут вопросы.

Nord777 писал(а):Если я правильно тебя понял, то ты хочешь в рантайме модифицировать контролы на форме(или панели).
Нет. Мне надо создать ещё одну вкладку TabPage...N на базовом TabControl, на которую накидать точно таких же контролов с первой TabPage1, которая как бы образец в моём проекте. Тогда, в дальнейшем, при визуальной модификации исходного контрола TabPage1, мне не придётся задумываться над коррекцией кода для создания следующих вкладок TabPage...N.

При этом у контролов на "вкладке-образце" (TabPage1) может быть вложенность контролов, типа: GroupBox, а в нём TableLayoutPanel, а в нём TextBox etc. Но тут я просто применяю рекурсию, т.к. количество вложенных контролов явно будет конечно. С этим я разобрался самостоятельно уже.

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

Nord777 писал(а):У всех контролов есть свойста Location, Parent, Name.
Все контролы перебираются
For Each Ctrl As Control In Panel1.Controls
...
Next
Проблема то в чем?
Они "переползают" когда я их перебираю на новую вкладку, гады :) Я им меняю имена, но т.к. по сути операция присваивания новому контролу старого, сводится всего-лишь к созданию ссылки на старый, то меняй имена, не меняй - операции проводятся над исходным контролом. Т.е.: ничего нового не создаётся.

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

В принципе уже тут кой-чего нарыл:
http://forums.microsoft.com/MSDN/ShowPo ... 5&SiteId=1

http://www.codeproject.com/cs/miscctrl/ ... oneTst.asp

Правильным путём иду, а?
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.06.2007 (Сб) 19:52

да
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 23.06.2007 (Сб) 20:24

Nord777 писал(а):да
Спасибо.

Мне, похоже, вполне хватит http://www.codeproject.com/cs/miscctrl/ ... oneTst.asp - Copy-Paste, т.к. Events мне копировать не нужно. Только внешние параметры контролов.

Ещё раз спасибо. Дальше разберусь.
В культурной столице проститутки берут книгами...

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 27.06.2007 (Ср) 21:06

asharky писал(а):Ещё раз спасибо. Дальше разберусь.
Ничего путного не получается :(

Неужто в .NET нет простого и понятного способа скопировать любой контрол? :shock:
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 27.06.2007 (Ср) 21:55

Что конкретно у тебя не получается?
Тот пример рабочий.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Сообщение asharky » 27.06.2007 (Ср) 22:20

Nord777 писал(а):Что конкретно у тебя не получается?
Тот пример рабочий.
Да я понимаю, что он рабочий. Но... не нравится он мне. Я как вот это увидал:
Код: Выделить всё
switch(ctrlName)
{            
   case "Label":
      ctrl = new Label();
      break;
   case "TextBox":
      ctrl = new TextBox();
      break;
   case "PictureBox":
      ctrl = new PictureBox();
      break;
   case "ListView":
      ctrl = new ListView();
      break;
   case "ComboBox":
      ctrl = new ComboBox();
      break;
   case "Button":
      ctrl = new Button();
      break;
   case "CheckBox":
      ctrl = new CheckBox();
      break;
   case "MonthCalender":
      ctrl = new MonthCalendar();
      break;
   case "DateTimePicker":
      ctrl = new DateTimePicker();
      break;
   default:
      Assembly controlAsm = Assembly.LoadWithPartialName(partialName);
      Type controlType = controlAsm.GetType(partialName + "." + ctrlName);            
      ctrl = (Control)Activator.CreateInstance(controlType);
      break;
}


так сразу и осознал, что этим путём мне идти совсем не хочется. Это же уродство какое-то, а не код :(

Это как из языка убрать chars и изображать их в виде процедур всяких - не стройно совершенно.

Но я выкрутился конечно, благо сам себе постановщик задач. Коллекцию контролов банально таскаю с текущей вкладки TabControl на активную (новую) вкладку. И переинициализирую их значения, благо они сами ничего у меня не считают, а только лишь отображают посчитанное программно. Получилось решение в пару строк - просто и стройно:
Код: Выделить всё
f_groupboxMain.Parent = _tabpageNew
f_tabcontrolMain.TabPages.Add(_tabpageNew)
f_tabcontrolMain.SelectedTab = _tabpageNew

Хотя это конечно капитуляция - это я тоже понимаю.
В культурной столице проститутки берут книгами...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 28.06.2007 (Чт) 0:46

так сразу и осознал, что этим путём мне идти совсем не хочется. Это же уродство какое-то, а не код

Ты всегда степень пригодности кода оцениваешь визуально?
Блок из кейсов сделан для увеличения быстродействия. Создать обьект напрямую быстрее чем через рефлексию.
Вот тот же код, только немного подправлен и урезан.
Код: Выделить всё
Imports System.ComponentModel
Imports System.Reflection

Public Class Form1

    Public Shared Function CloneCtrl(ByVal ctrl As Control) As Control
        Dim NewCtrl As Control
        Dim T As Type = ctrl.GetType

        NewCtrl = DirectCast(Activator.CreateInstance(T), Control)
        T = NewCtrl.GetType
        Dim Pi As PropertyInfo

        For Each myProperty As PropertyDescriptor In TypeDescriptor.GetProperties(ctrl)
            If Not myProperty.PropertyType.IsSerializable Then Continue For
            Pi = T.GetProperty(myProperty.Name)
            If Pi.CanWrite Then
                Pi.SetValue(NewCtrl, myProperty.GetValue(ctrl), Nothing)
            End If
        Next

        Return NewCtrl
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ctrl As Control = CloneCtrl(CheckBox1)
        Ctrl.Name &= "clone"
        Ctrl.Text = "created by clone"
        Ctrl.Location = New Point(Ctrl.Location.X, Ctrl.Location.Y + 50)
        Ctrl.Visible = True
        Me.Controls.Add(Ctrl)
    End Sub
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


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

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

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

    TopList