Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# Winform расстояние между панелями при изменении ширины\высоты

72K
09 сентября 2013 года
Num2
17 / / 22.08.2013
всем привет.
у меня тут возникла проблема с динамически созданными панелями, когда я меняю размер формы своей, N-ое кол-во панелей меняют свою ширину тоже, и при необходимости (зависит от текста внутри панели), меняют свою высоту.. ну и потом когда ширина формы делается больше - панели по высоте\ширине становятся обратно нормальными... НО когда высота у панелей изменяется - нужно чтоб расстояние оставалось неизменным... пробовал разные методы уже, но все получается криво... подскажите плиз.

Код:
public void checkResize(string msg_out, object panel_sender, object text_msg_sender, int panHei, int numbs)
        {
            Panel pan_item = (Panel)panel_sender;
            Label lab_item = (Label)text_msg_sender;
            char[] msg_arr = msg_out.ToCharArray();
            int panWidthRaznost = 308 - pan_item.Width;
            int panWidth = pan_item.Width;
            if (int.Parse(pan_item.Name) != numbs - 1) //если это 1ая панель - не делать изменения локации для нее
            {
                if (panWidth < buff) //если панель сужается - делать расстояние между панелями больше
                {
                    this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
                   /* if (panWidthRaznost % 15 == 0)  //попытка №2
                    {
                        for (int i = int.Parse(pan_item.Name); i >= 0; i--)
                        {
                            panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y + 1);
                        }
                    } */

                }
                if (panWidth > buff) //если панель растягивается - делать расстояние между панелями меньше
                {
                    this.Controls.OfType<Panel>().OrderBy(x => Convert.ToInt32(x.Tag)).ToList().ForEach(pan => setPanelLocation(pan)); //попытка №1
                    /*if (panWidthRaznost % 15 == 0) //попытка №2
                    {
                        for (int i = int.Parse(pan_item.Name); i >= 0; i--)
                        {
                            panel1.Controls[i.ToString()].Location = new Point(panel1.Controls[i.ToString()].Location.X, panel1.Controls[i.ToString()].Location.Y - 1);
                        }
                    }*/

                }
                buffCountPan++;
                if (buffCountPan == panel1.Controls.Count - 1)
                {
                    buff = panWidth;
                    buffCountPan = 0;
                }
               
            }
            if (msg_arr.Length > 26) //если кол-во символов в сообщении меньше - не менять размеры панели и лейбла
            {
                int panWidthRaznostForHeight = (308 - pan_item.Width) / 4; //разность на сколько уменьшили панель
                pan_item.Height = panHei + panWidthRaznostForHeight; //разность на сколько нужно увеличить панель
                lab_item.MaximumSize = new System.Drawing.Size(300 - panWidthRaznost, 100); //изменение ширины лейбла сообщения
                lab_item.MinimumSize = new System.Drawing.Size(300 - panWidthRaznost, 14); //изменение ширины лейбла сообщения
            }
        }
 
        private void setPanelLocation(Panel pnl)
        {
            int iPanelOrder = Convert.ToInt32(pnl.Tag);
            if (iPanelOrder == 0)
            {
                pnl.Top = MinimumStartLocation;
            }
            else
            {
                pnl.Top = this.Controls.OfType<Panel>().ToList().Find(pan => Convert.ToInt32(pan.Tag) == iPanelOrder - 1).Bottom + DistanceBetweenPanel;
            }
        }


так-же выложу для большего понятия кусок проекта...
Прикрепленные файлы:
1.6Мб
Загрузок: 778
326
16 сентября 2013 года
sadovoya
757 / / 19.11.2005
Я чайник в шарпе, но что, там нет "якорей", "подпорок" и "пружин" для элементов интерфейса? Зачем вручную вычислять новые размеры и координаты?
72K
16 сентября 2013 года
Num2
17 / / 22.08.2013
вопрос исчерпан, но отвечу на твой вопрос, для якоря есть, и они используются для right \ left , а для top \ bottom делать для динамических панелей не желательно, т.к. єто динамические панели, они просто в кучу собьются... поэтому было сделано с помощью еще 1 панели для каждой панельки и присвоен стиль Dock=top.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог