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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание/удаление элементов управления формы 
:(
    Опции темы
blast99
Дата 28.9.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



Пишу для .NET CF.
Есть одна форма + несколько пунктов меню каждый из них является практически отдельной мелкой программой со своими элементами управления.
Соответсвенно хочеться:
 - сначала видеть перед собой голую форму/заставку
 - при выборе пунка меню создаются определенные эл-ты управ-я
 - при выборе другого пункта, удаляются все предыдущие элементы и создаются новые.

Вопрос в логике - как реализовать, чтобы динамически создавались эл-ты и удалялись предыдущие.
Т.е. сейчас сделал, чтобы выбрав один(их будет несколько 2-4) эл-т меню, создается Label, заполняется текстом. Вроде все норм, но как потом сделать, чтобы при выборе другого пункта меню(практически новая программка), предыдущие эл-ты были бы удалены.
Сейчас все сделано просто и тупо. Создать label по клику в меню.
Код

private void menuCircuit_Click(object sender, EventArgs e)
{
      Label lblMain = new Label();
      lblMain.TextAlign = ContentAlignment.TopCenter;
      lblMain.Text = "Hello world";
      Controls.Add(lblMain);
}


Думаю, что надо будет сделать несколько классов(класс на каждый эл-т меню) и при выборе в меню содавать объект текущей "программки", но как удалить удалить предыдущие эл-ты/объекты... и какой из них создавался...

В голове каша! Совсем запутался...  smile 

Это сообщение отредактировал(а) blast99 - 28.9.2006, 15:50
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
stab
Дата 28.9.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



 - сначала видеть перед собой голую форму/заставку

с этим всё понятно.

 - при выборе пунка меню создаются определенные эл-ты управ-я

создавать умеешь.

 - при выборе другого пункта, удаляются все предыдущие элементы и создаются новые.

удалять так:
Код

for (int i = Controls.Count - 1; i >= 0; i--)
{
    Controls[i].Dispose();
}

т.е. пробегаем по всем котнролам на форме и уничтожаем их. если удалять все, то может удалиться что-то нужное, чтобы этого избежать, при создании пометь те контролы, которые нуждаются в уничтожении, с помощью свойства Tag и вставь проверку в цикл уничтожения, например:
Код

for (int i = Controls.Count - 1; i >= 0; i--)
{
    if ( Controls[i].Tag is int && ((int) Controls[i].Tag) == 1 )
    {
        Controls[i].Dispose();
    }
}

помечать соответственно надо например так:
Код

lblMain.Tag = 1;



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
blast99
Дата 28.9.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



cully, спасибо большое!
Тогда можно еще парочку вопросов...

Как мне создать из моего класса элемент на форме? Т.е. я создал свой класс в области namespace и вроде наследуя свойства Form'ы:
Код

    public class CircuitDarts : Form1 {
            Label lblMain = new Label();
            lblMain.TextAlign = ContentAlignment.TopCenter;
            lblMain.Text = "Hello world";
            Controls.Add(lblMain);
    }

но все равно работать не получается!
Если на:
Код

Label lblMain = new Label();

не ругается, то на:
Код

            lblMain.TextAlign = ContentAlignment.TopCenter;
            lblMain.Text = "Hello world";
            Controls.Add(lblMain);

уже ругается...  smile 
и
Как привязать обработчик созданной кнопке?

Добавлено @ 17:22 
По поводу кнопки...
В msdn'е нашел только вот этот пример:
Код

private void InitializeMyButton()
 {
    // Create and initialize a Button.
    Button button1 = new Button();
 
    // Set the button to return a value of OK when clicked.
    button1.DialogResult = DialogResult.OK;
 
    // Add the button to the form.
    Controls.Add(button1);
 }


А как привязать обработник, не понятно.
Наверно плохо искал...  smile 
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 28.9.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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




M
mr.DUDA
blast99, одна тема - один вопрос пжалста !


Цитата(blast99 @  28.9.2006,  17:19 Найти цитируемый пост)
public class CircuitDarts : Form1
{
            Label lblMain = new Label();
            lblMain.TextAlign = ContentAlignment.TopCenter;
            lblMain.Text = "Hello world";
            Controls.Add(lblMain);    
}

Это кусок кода ? Или весь ? Объявлен класс и прямо так, без тела метода, пишется какой-то код.

Цитата(blast99 @  28.9.2006,  17:19 Найти цитируемый пост)
Как привязать обработчик созданной кнопке?

Если в дизайнере - просто тыкнуть даблкликом по кнопке - обработчик и создастся. Можно редактировать его. Если в коде (т.е. всё руками) - см. событие Button.Click и оператор += для событий.


--------------------
user posted image
PM MAIL WWW   Вверх
blast99
Дата 28.9.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



По поводу кода без метода... это я и правда что-то маху дал!  smile
Почему-то забыл создать какой-либо метод или засунуть в конструктор.

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

Так же Вы написали:
" Если в коде (т.е. всё руками) - см. событие Button.Click и оператор += для событий."

Ок, завтра доберусь до компа буду искать и пробовать, но если не сложно можно показать строчку присвоения/обявления собития для конопки?
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
blast99
Дата 29.9.2006, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



Ну вот я и добрался до компа...
Вот только, что нашел .NET Controls: The Button. Там все написано и как создать и как привязать событие к кнопке.

google рулит!  smile 
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
blast99
Дата 29.9.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



хм, опять странно...
Написал вот такой класс:
Код

    public class CircuitDarts : Form1 {

        public void initControls()
        {
            Label lblMain = new Label();
            lblMain.TextAlign = ContentAlignment.TopCenter;
            lblMain.Text = "Hello world";
            Controls.Add(lblMain);

            Button btnResume = new Button();
            btnResume.Text = "Resume";
            btnResume.Location = new Point(32, 20);
            btnResume.Size = new System.Drawing.Size(120, 48);
            Controls.Add(btnResume);
        }
    }


Далее соответственно создание объекта и работа с ним:

Код

        private void menuCircuit_Click(object sender, EventArgs e)
        {
            CircuitDarts cd = new CircuitDarts();
            cd.initControls();
        }


так вот после компиляции, захожу в меню, выбираю нужный пункт ииии..... и ничего не происходит  smile 
Может я чего не так делаю?
Я пологаю все из-за Controls.Add... Может он незнает куда их добавить...

Это сообщение отредактировал(а) blast99 - 29.9.2006, 08:09
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
Naum
Дата 29.9.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Программа у тебя запускается с какой формы? 
Если запускается с CircuitDarts, то 

Код

 Private void menuCircuit_Click(Object sender, EventArgs e)
 {
    initControls();
 }


Если с другой формы, то
Код

        private void menuCircuit_Click(object sender, EventArgs e)
        {
            CircuitDarts cd = new CircuitDarts();
            cd.initControls();
            cd.Show(); 'Или cd.ShowDialog() если хотим отобразить форму модально.
        }


Беда в том, что ты создаешь новый экземпляр CircuitDarts, а его же нужно еще отобразить.



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
blast99
Дата 29.9.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



Naum, вроде все понятно и все работает, НО как???
Код вот такой:
Код

// форма
    public class Form1 : System.Windows.Forms.Form
    {
//...
//...
//...
        private void menuCircuit_Click(object sender, EventArgs e)
        {
            CircuitDarts cd = new CircuitDarts();
            cd.initControls();
            cd.Show();
        }

    }

//  это мой класс
    public class CircuitDarts : Form1 {

        public void initControls()
        {
            Label lblMain = new Label();
            lblMain.TextAlign = ContentAlignment.TopCenter;
            lblMain.Text = "Hello world";
            Controls.Add(lblMain);
            
            Button btnResume = new Button();
            btnResume.Text = "Resume";
            btnResume.Location = new Point(32, 20);
            btnResume.Size = new System.Drawing.Size(120, 48);
            Controls.Add(btnResume);
            
        }
    }

Так, вот после того как я выбираю меню действиельно появляются элемнты! Однако, я нажимаю ок (типа закрыть окно) и вижу форму без элементов, еще раз Ок и форма закрывается. Далее иду в Setting\Memory\Running Programs и о чудо у меня 2 процесса! Соответсвенно в одном есть элементы в дрогом - нет.

Ничего не понимаю...  smile 

--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
Naum
Дата 29.9.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Цитата(blast99 @  29.9.2006,  12:06 Найти цитируемый пост)
о чудо у меня 2 процесса!


Так и есть стартует проект-то у тебя скорее всего с Form1 (причем, без элементов), затем ты запускаешь еще одну форму (то-бишь еще один процесс) и добавляешь на эту новую форму элементы. Поэтому и получается, что Form1 у тебя без элементов, а cd с элементами.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
blast99
Дата 29.9.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



хм, а как сдлеать чтобы на уже готовой, созданной форме, я создавал/удалял элементы из своего класса?
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 29.9.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Да всё правильно в коде, только на клик кнопки подписаться надо имхо..


--------------------
user posted image
PM MAIL WWW   Вверх
blast99
Дата 29.9.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



mr.DUDA, эээ... если не сложно объясни, что такое - "подписаться надо" ?
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
blast99
Дата 29.9.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сисадмин
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 3.5.2005
Где: Россия, г. Ставро поль

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



Только, что придумал, что можно все методы моего класса описать в классе формы, тогда не надо будет создавать новый объект... 
Но все же хотелось бы выделить все в отдельный класс. Половина сделана, но вот только работает она не корректно...  smile 
--------------------
Зачастую, наши возможности ограничены лишь нашими желаниями. И ничто так не ограничивает желания, как заниженная оценка своих возможностей.
PM MAIL ICQ   Вверх
Naum
Дата 29.9.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Цитата(blast99 @  29.9.2006,  15:30 Найти цитируемый пост)
Только, что придумал, что можно все методы моего класса описать в классе формы, тогда не надо будет создавать новый объект... 


Цитата(Naum @  29.9.2006,  10:44 Найти цитируемый пост)
Если запускается с CircuitDarts, то 
Код

 Private void menuCircuit_Click(Object sender, EventArgs e)
 {
    initControls();
 }



Я именно про это и говорил.  smile

Добавлено @ 14:44 
Цитата(blast99 @  29.9.2006,  13:09 Найти цитируемый пост)
mr.DUDA, эээ... если не сложно объясни, что такое - "подписаться надо" ? 


Проще говоря, это значит повесить обработчик какого-либо события.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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