Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обращение к Controls на TabPage


Автор: vovkru 16.1.2014, 17:37
Попытаюсь максимально упростить задачу, что-бы было понятно.
На форме есть TabControl1,  Label1 и два Button
  При нажатии на кнопку button1 создаётся очередной TabPage и на нём Label 
Код

        private void button1_Click(object sender, EventArgs e)
        {
            TabPage newTabPage = new TabPage("New Tab page");
            tabControl1.Controls.Add(newTabPage);
            tabControl1.SelectedTab = newTabPage;

            Label label2 = new Label();
            label2.Text = "Label2";
            newTabPage.Controls.Add(label2);
        }

Как теперь обратиться к параметрам созданного Label ? К примеру изменить текст по нажатию кнопки button2 ?
 Ведь при написании 
Код

        private void button2_Click(object sender, EventArgs e)
        {
           label2.Text = "Проверка" ;
        }

 label2 ещё не существует как и label на всех остальных создаваемых TabPage, а они должны будут содержать собственную информацию.

Автор: jonie 16.1.2014, 23:37
Если вы новчек, то лучше бы писали в тот раздел...
Код


Как теперь обратиться к параметрам созданного Label ?
взять его по имени (или индексу) из коллекций Controls того элемента в который вы его добавляли.

Но вообще настоящие мужики так не пишут. Это унылое ###, а не архитектура.

В простом случае:
Сначала выбрасывают из головы всякие "лейблы", "табы", и делают пустое консольное приложение. 
Далее описывают в нём вашу МОДЕЛЬ. Например так:
Код

public class PageData {
  //это типа описание того что на "таб-е" должно быть, например текст лейбла, только называть надо осмысленно конечно.
public string LabelCaption {get;set;}
}

public class Page {
 public string Id {get;set;}
 public string Caption {get;set;}
 public PageData Data  {get;set;}
}

public class PageCollection : ICollection<Page> {
//....implement me!
}


и т.д. - т.е. декомпозируют предметную область на классы.

Далее думают: "погодите, а ведь при добавлении в PageCollection кто-то должен об этом узнавать, значит надо реализовать паттерн "наблюдатель". Ок - сказано - сделано:
Код

partial class PageCollection : INotifyCollectionChanged {
  //implement me too!
}


Хмм, скажете вы, а если я поменяю Caption где-то в Page или PageData, то как заинтересованные об этом узнают ? Ок, надо реализоват наблюдатель и там:
Код

partial class Page : INotifyPropertyChanged {
 //todo
}

partial class PageData : INotifyPropertyChanged {
 //todo
}


Оккей, теперь можно подумать как к этому мусору прикручивать интерфейсную часть. Набрасываем всякие разные контролы в презентере (ну если мы например юзаем MVP паттерн) подписываемся на всё что надо у модели и управляем ВИДОМ.

А вид может вызывать (вероятно) некоторые изменения модели - нет проблем - достаточно делегировать изменение презентеру в уже существующей модели....

Вуаля.!

Автор: vovkru 17.1.2014, 10:23
Благодарствую! Есть от чего отталкиваться!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)