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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить ссылку на форму,содержащую мой Компонент, Желательно в конструкторе компенента ) 
V
    Опции темы
lam0x7C4
Дата 12.7.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Создал я типа свой компонент ( myComponent: Component), в дизайнере форми бросаю его на форму. Как получить ссилку на эту  форму.

Код

public class myComponent : Component
{
        private Form frmParent;

        // Конструктори.

        public myComponent()
        {
            InitializeComponent();                
        }

        public myComponent(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
            // Желательно где-то здесь найти вот ету форму
            // How ?? --> // frmParent = (Form)container //или чё-то типа того.  
        }
        // .. конструктори
}

Ничего не получаеться  smile (

Это сообщение отредактировал(а) lam0x7C4 - 12.7.2007, 17:55
PM MAIL ICQ   Вверх
Naum
Дата 12.7.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lam0x7C4 @  12.7.2007,  18:54 Найти цитируемый пост)
frmParent = (Form)container

А чем это не нравится?


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


Шустрый
*


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

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



Цитата(Naum @ 12.7.2007,  18:36)
Цитата(lam0x7C4 @  12.7.2007,  18:54 Найти цитируемый пост)
frmParent = (Form)container

А чем это не нравится?

Не работает.
После етого frmParent == null.
PM MAIL ICQ   Вверх
tol05
Дата 12.7.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Цитата(lam0x7C4 @  12.7.2007,  18:39 Найти цитируемый пост)
После етого frmParent == null

значит, контрол принадлежит не форме, а контолу на этой форме (панели, например, или GroupBox-у)

Если контейнер принял твой контрол в свою коллекцию (container.Add(this); сработало), то он не может быть равен null.
контейнер не приводится к типу Form (базовому для всех форм) - Значит контейнер - просто не форма


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
lam0x7C4
Дата 13.7.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Просто у меня не контрол( Control ), a компонент( Component ). Ето немножко разние вещи. В дизайнере он[Component] бросаеться не на форму, он бросаеться на полоску, что под формой( туда куда MenuStrip бросаетья )...

Ну предположим, принадлежит компонент не форме, а контролу. Как тогда контрол найти?

Проблема вроде елементарная, но  smile .
PM MAIL ICQ   Вверх
tol05
Дата 13.7.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



я говорил об общем принципе, когда упоминал о контроле. Это не принципиально. 
Как найти? Ну допустим, есть форма, на ней панель, на панели - кнопка. Тогда так:
Код

public Form1()
{
    InitializeComponent();
        
    Panel p = new Panel();
    p.Name = "myPanel";
    this.Controls.Add(p);

    Button b = new Button();
    b.Name = "myButton";
    p.Controls.Add(b);

    Panel unknownPanel;
    Button unknownButton; 

    foreach( Control control in this.Controls )
    {
        unknownPanel = control as Panel;
        if(!Equals(unknownPanel, null) && unknownPanel.Name == "myPanel") break;
    }
    foreach(Control control in unknownPanel.Controls)
    {
        unknownButton = control as Button;
        if(!Equals(unknownButton, null) && unknownButton.Name == "myButton") break;
    }
}

можно и так...
Код

Panel unknownPanel = this.Controls.Find("myPanel", true)[0] as Panel;
Button unknownButton = this.Controls.Find("myButton", true)[0] as Button;

тогда все ищется только через форму. Но "[0]" - сам понимаешь, криво... Все равно потом цикл по всем найденным делать нужно.

Это сообщение отредактировал(а) tol05 - 13.7.2007, 10:10


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Naum
Дата 13.7.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lam0x7C4 @  13.7.2007,  10:40 Найти цитируемый пост)
Как тогда контрол найти?

Код

frmParent = (Control)container;



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


Шустрый
*


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

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



Цитата(Naum @ 13.7.2007,  10:20)
Цитата(lam0x7C4 @  13.7.2007,  10:40 Найти цитируемый пост)
Как тогда контрол найти?

Код

frmParent = (Control)container;

Unable to cast object of type 'System.ComponentModel.Container' to type 'System.Windows.Forms.Control'.



tol05, пасиба за инфу. Но проблема немножко не в этом.

Мне не надо находить контрол, зная форму.
Все, что у меня есть, ето компонент, который я буду потом юзать на разных формах . Тоесть, форму надо всегда определять в конструкторе.(Хотя я уже сомневаюсь, что ето реально)

Код

public class myComponent : Component
{
        private Form frmParent;

        // Конструктори.

        public myComponent()
        {
            InitializeComponent();                
        }

        public myComponent(IContainer container)
        {
            container.Add(this);// <-- по идее, отсюда можна найти форму.
            InitializeComponent();            
        }
        // .. конструктори
}


p.s.Опять же, если бы это был Control, я бы форму уже давно нашел(там просто), у меня Component.


p.p.s. Все равно, всем пасиба за помощь smile

Это сообщение отредактировал(а) lam0x7C4 - 13.7.2007, 10:49
PM MAIL ICQ   Вверх
Naum
Дата 13.7.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lam0x7C4 @  13.7.2007,  11:46 Найти цитируемый пост)
Цитата(Naum @ 13.7.2007,  10:20)
Цитата(lam0x7C4 @  13.7.2007,  10:40 Найти цитируемый пост)
Как тогда контрол найти?

Выделить всёкод C#
1:
    
frmParent = (Control)container;

Unable to cast object of type 'System.ComponentModel.Container' to type 'System.Windows.Forms.Control'.

Ссори. frmParent = (ContainerControl)container;
Types derived by ContainerControl:
  • System.Windows.Forms.Form
  • System.Windows.Forms.PropertyGrid
  • System.Windows.Forms.SplitContainer
  • System.Windows.Forms.ToolStripContainer
  • System.Windows.Forms.ToolStripPanel
  • System.Windows.Forms.UpDownBase
  • System.Windows.Forms.UserControl




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


Шустрый
*


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

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



Цитата
10:40 Найти цитируемый пост)

Цитата
Выделить всёкод C#

 smile 

Пасиба  smile .
Ща потестирую...



Это сообщение отредактировал(а) lam0x7C4 - 13.7.2007, 15:06
PM MAIL ICQ   Вверх
Naum
Дата 13.7.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А еще в отладчике можно посмотреть какого типа IConteiner передается в конструктор твоего компонента.


Это сообщение отредактировал(а) Naum - 13.7.2007, 16:05


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


Шустрый
*


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

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



ммм, 
чё-то не очень оно хочет работать  smile .Я уже весь день над етим просидел и ничего уже не думаеться smile  .
Короче: smile .


PM MAIL ICQ   Вверх
mr.DUDA
Дата 13.7.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Извиняюсь, а this.Parent что не катит ?


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


Шустрый
*


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

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



Цитата(mr.DUDA @ 13.7.2007,  22:57)
Извиняюсь, а this.Parent что не катит ?

Сорри, что не отвечал так долго - инет глючит.
Неа, в даном случае не катит. Просто надо получить ссилку на форму еще до того как она становиться видимой для юзера. И вот фишка в том, что до етого момента this.Parent == null. Нужно ловить ссилку на форму в каком-то собитии(Пробовал "Load" компонента, но и там не катит, больше не нашел подходящих событий). 

--
Ах, да. Свойства Parent в компонента нет.

Это сообщение отредактировал(а) lam0x7C4 - 16.7.2007, 17:15
PM MAIL ICQ   Вверх
mr.DUDA
Дата 16.7.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Метод FindForm ещё есть.


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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