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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dock-инг контролов, неправильное позиционирование 
V
    Опции темы
marcusmae
Дата 30.6.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Здравствуйте.
Если я правильно понял, то в MVS 2005 с докингом контролов не всё благополучно. Опишу проблему. Допустим, внутри добавленного через дизайнер tabControl-а динамически создаются DataGridView с аттрибутом Dock равным DockStyle.Top, а затем маленький tabControl с DockStyle.Filling. Каким-то непонятным образом последний подлезает под DataGridView, заполняя всю область большого tabControl-a.
Быстрого решения этой проблемы не нашёл и решил DataGridView оставить с DockStyle.Top, а размеры маленького tabControl-а подстраивать вручную по событию изменения размера их общего контейнера :

Код

        private void tabControl2_SizeChanged(object sender, EventArgs e)
        {
            if (tabControl2.TabCount != 0)
            {
                for (int tabIndex = 0; tabIndex < tabControl2.TabCount; tabIndex++)
                    if (tabControl2.TabPages[tabIndex].Controls.Count == 2)
                    {
                        Point location = tabControl2.TabPages[tabIndex].Controls[0].Location;
                        int difference = tabControl2.TabPages[tabIndex].Controls[0].Height;
                        location.Y += difference;
                        tabControl2.TabPages[tabIndex].Controls[1].Location = location;
                        tabControl2.TabPages[tabIndex].Controls[1].Size = new Size(tabControl2.TabPages[0].Width, tabControl2.TabPages[0].Height-difference);
                    }
            }
        }
 

но что-то забыл, т.к. размер не изменяется, причём при debug-е вход в самый внутренний цикл происходит, но аттрибут Size для Controls[1] не меняется.  smile Подскажите, в чём проблема, пожалуйста!

Вообще, Dock иногда ведёт себя странно. Допустим, нужно расположить в левой области формы не один контрол, а два -  один под другим. Попытка сделать это, присвоив каждому DockStyle.Left приводит к тому, что они располагаются слева, но последовательно по горизонтали. В общем-то, логично. Тогда кладём их вдвоём в GroupBox и уже ему назначаем DockStyle.Left. = То, что надо, вроде бы. Но опять-таки : стоит добавить в форму вертикальный Splitter и элемент с DockStyle.Fill, как всё это хозяйство начинает наползать друг на друга на 3-5 пикселей в месте расположения сплиттера.  smile Было так у кого-нибудь? 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 1.7.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А если тупо скопировать код из InitializeComponent() ? 


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


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата

А если тупо скопировать код из InitializeComponent() ?

Хм, так действительно делают? = Попробовал - ничего не изменилось. Во всяком случае, это - ответ только на вторую часть вопроса. 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 2.7.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(marcusmae @  30.6.2006,  22:13 Найти цитируемый пост)
Каким-то непонятным образом последний подлезает под DataGridView, заполняя всю область большого tabControl-a.

Ага, есть такая трабла. Методом тыка выяснил, что при заполнении области (dock.fill), контрол смотрит только на контролы "под" ним или находящиеся с ним на одном уровне.
(Не знаю как это называется, но есть в дизайнере кнопки: BringToBack и BringToFront  которые меняют уровень контрола на форме. Т.Е. меняют положение контрола в третьем измерении (глубина). Может еще есть соответствующее свойство у контрола) 

Это сообщение отредактировал(а) ivashkanet - 2.7.2006, 11:44
PM MAIL WWW ICQ   Вверх
Хоббит
Дата 2.7.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



свойство то есть... достигается оно нажатием правой кнопки мыши и BringToFront ToBack но в данном случае.. это не помогает вроде 
PM MAIL   Вверх
ivashkanet
Дата 2.7.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Хоббит @  2.7.2006,  12:33 Найти цитируемый пост)
свойство то есть... достигается оно нажатием правой кнопки мыши и BringToFront ToBack но в данном случае.. это не помогает вроде

Нет. Свойство должно хранить уровень (level) контрола на форме (Типа z-Index в HTML). 0 -- самый нижний. Чем больше число тем выше находиться контрол.
Цитата(ivashkanet @  2.7.2006,  11:40 Найти цитируемый пост)
(Не знаю как это называется, но есть в дизайнере кнопки: BringToBack и BringToFront  которые меняют уровень контрола на форме. Т.Е. меняют положение контрола в третьем измерении (глубина). Может еще есть соответствующее свойство у контрола) 

Я прогнал эту пургу только чтобы объяснить что такое "уровень" контрола на форме  smile  
PM MAIL WWW ICQ   Вверх
marcusmae
Дата 2.7.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



BringToBack/BringToFront - немного не то. В любом случае, контрол с большим индексом будет наползать на тот, что с меньшим. smile

Может быть всё же не так сложно следить за размером контрола вручную? Кто бы и как стал делать? В приведённом мной ранее коде чего-то не хватает.

 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 2.7.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Еще можно воспользоваться свойством контрола Anchor 
PM MAIL WWW ICQ   Вверх
marcusmae
Дата 5.7.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Удивительно, SendToBack/BringToFront действительно немного помогло! = Но, увы, при изменении размеров окна, контролы не держат приемлемого соотношения размеров : с увеличенем окна контрол с DockStyle.Top безвозвратно сужается. А если сразу нажать кнопку Maximize, то контрол с наибольшим z-индексом затмевает все остальные (хотя по-началу заполнял оставшееся место от контрола с DockStyle.Top). Цирк, в общем smile)) Такое ощущение, что нужно определить обработчик события OnResize и долго шаманить в нём с z-order-ами контролов... 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 5.7.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Проверил, сам докинг видать коряво работает. Дизайн-тайм ему нужен зачем-то... smile
Может, он (дизайнер) в ресурсы формы ещё что-то складывает ?... 


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


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Ура) Добавил Splitter между контролами, и всё стало работать нормально даже после изменения размеров: сплиттер своим Location фиксирует размеры одного из контролов. А чтобы один не подлезал под другой, нужно каждый вновь добавленный контрол "усылать" вглубь SendToBack()-ом.
 


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
ivashkanet
Дата 5.7.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(marcusmae @  5.7.2006,  12:38 Найти цитируемый пост)
каждый вновь добавленный контрол "усылать" вглубь SendToBack()-ом.

Ужас  smile Неужели нельзя по другому сделать smile  
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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