Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
#1

Изменение координат 400 контролов - форма лагает - C#

08.10.2015, 22:00. Просмотров 606. Ответов 16
Метки нет (Все метки)

При изменении координат (около 250 -500 объектов) тормоза и не очень красивые эффекты.
Подскажите пожалуйста, можно как то это "вылечить" ?

Списки заполняются динамически в зависимости от необходимого количества полей.

Выглядит на форме так (это калькулятор под некоторые расчеты)
|1|textbox|textbox|textbox|textbox|textbox|textbox|button add|button del|
|2|textbox|textbox|textbox|textbox|textbox|textbox|button add|button del|

....
|50|textbox|textbox|textbox|textbox|textbox|textbox|button add|button del|

Поля добавляются в конец и в любом месте в середину при отображении на форме. И вот когда добавляю в середину то нужно менять координаты всех полей которые ниже чтоб они выстроились по порядку, при удалении из середины тоже самое, тогда и начинает лагать.

Цикл пересчета координат.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Списки (под каждый столбец) List<TextBox> a1_array = new List<TextBox>(0);
 
while (i < count)
                {
                   a1_array[i].Location = new Point(a1array[0].Location.X, a);
                   a2_array[i].Location = new Point(a2array[0].Location.X, a);
                   a3_array[i].Location = new Point(a3array[0].Location.X, a);
                   a4_array[i].Location = new Point(a4array[0].Location.X, a);
                   a5_array[i].Location = new Point(a5array[0].Location.X, a);
                   a += 22;
                   i++;
                }
this.Refresh();

http://www.cyberforum.ru/windows-forms/thread1431945.html

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2015, 22:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Изменение координат 400 контролов - форма лагает (C#):

Изменение размеров контролов на форме
Есть форма, на ней элементы. Если при запуске программы, изменять размеры...

Изменение свойств вложенных контролов
Здравствуйте, появился такой вопрос. Есть у меня компонент, на нём, допустим,...

Перетаскивание и изменение размеров контролов
В общем у меня такая проблема. Я перетаскиваю элементы из листбокса на панель....

Изменение контролов формы из стороннего класса
Добрый день! Помогите с пониманием решения задачи? Суть: 1. Есть public...

ListBox и изменение расположения контролов в нём
Всем доброго времени суток. Ребят, нужна помощь с заданием по C#. Звучит оно...

16
Fulcrum_013
Заблокирован
08.10.2015, 22:18 #2
Еще бы оно не лагало, при каждом изменннии координаты если включены какие либо алигны форма пересчитывает и позиции всех остальных. А чем не устраивает StringGrid если столько контролов? и нативный unmanaged C++?
0
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
08.10.2015, 22:49  [ТС] #3
0. Алигнов нет, пока еще все пусто )
1. Не хочу чтоб это было явно похоже на таблицу.
2. Просто решил попробовать сделать что нибудь на C# первый раз. Есть аналог на js css html, ничего не лагает даже при добавлении 1000 полей.
3. Есть еще проблема с координатами, когда появляется прокрутка а верхняя часть уезжает наверх, то поля так и считаются от левого верхнего угла, а при прокрутке обратно вверх получается большой разрыв между шапкой и полями.
0
Storm23
Эксперт .NETАвтор FAQ
5901 / 3498 / 1304
Регистрация: 11.01.2015
Сообщений: 4,607
Записей в блоге: 31
08.10.2015, 23:08 #4
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от Askfor Посмотреть сообщение
около 250 -500 объектов

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using FastVirtualGridNS;
 
namespace WindowsFormsApplication313
{
    public partial class Form1 : Form
    {
        private List<List<string>> data = new List<List<string>>();
 
        public Form1()
        {
            InitializeComponent();
 
            //заполняем случайными данными
            var rnd = new Random();
            for (int i = 0; i < 1000; i++)
            {
                var row = new List<string>();
                for (int j = 0; j <= rnd.Next(10); j++)
                    row.Add(rnd.Next(1000).ToString());
                data.Add(row);
            }
 
            //
            gridMain.ColCount = 2;
            gridMain.SetColumnWidth(1, 600);
            gridMain.RowCount = data.Count;
        }
 
        private void gridMain_CellValueNeeded(object sender, FastVirtualGridNS.ValueNeededEventArgs e)
        {
            if (e.Place.Row >= 0)
            switch(e.Place.Col)
            {
                case 0: 
                        e.Elements.Add(new TextElement{Text = e.Place.Row.ToString(), Readonly = true, ForeColor = Color.Gray});
                        break;
                case 1:
                        foreach (var v in data[e.Place.Row])
                            e.Elements.Add(new TextElement() {Text = v, Width = 50, HorizAlignment = StringAlignment.Near, EditOnClick = true});
                        e.Elements.Add(new ButtonElement() { Text = "Add", Width = 30 });
                        e.Elements.Add(new ButtonElement() { Text = "Del", Width = 30 });
                        break;
            }
        }
 
        private void gridMain_ElementClick(object sender, ElementEventArgs e)
        {
            var bt = e.Element as ButtonElement;
            if (bt != null)
            {
                switch (bt.Text)
                {
                    case "Add":
                        data[bt.Place.Row].Add("0");
                        break;
                    case "Del":
                        if (data[bt.Place.Row].Count > 0)
                            data[bt.Place.Row].RemoveAt(data[bt.Place.Row].Count - 1);
                        break;
                }
                e.Handled = true;
                gridMain.Invalidate();
            }
        }
 
        private void gridMain_CellValuePushed(object sender, ValuePushedEventArgs e)
        {
            if (e.Element is TextElement)
                data[e.Place.Row][e.Element.Index] = e.Value;
        }
 
        private void btInsert_Click(object sender, EventArgs e)
        {
            data.Insert(gridMain.Selection.From.Row, new List<string>());
            gridMain.Invalidate();
        }
    }
}
WindowsFormsApplication313.zip
Изменение координат 400 контролов - форма лагает
1
Fulcrum_013
Заблокирован
08.10.2015, 23:10 #5
Цитата Сообщение от Askfor Посмотреть сообщение
new Point(a1array[0].Location.X, a)
Да кстати а зачем координаты динамически выделяются? Динамическое выделение та еще тормозилка.
0
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
08.10.2015, 23:21  [ТС] #6
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да кстати а зачем координаты динамически выделяются? Динамическое выделение та еще тормозилка.
Так я и привел этот код, потому что предполагал что в этом проблема. А как их туда запихнуть то ?
Делал еще так, заводил один поинт и в него пихал координаты, результата не дало.

C#
1
2
3
4
5
6
7
8
9
Point addcoord = new Point();
 
while (i < count){
 
тут все списки
addcoord.X = a1_arraydel[0].Location.X;
                    addcoord.Y = a;
                    a1arraydel[i].Location = addcoord;
}
0
Fulcrum_013
Заблокирован
08.10.2015, 23:30 #7
Цитата Сообщение от Askfor Посмотреть сообщение
Делал еще так, заводил один поинт и в него пихал координаты, результата не дало.
Ну это более правильно. Так знач тормоз где то в другом месте. скорее всего в том что при изменении координаты форма пересчитывает свой скролпос а следом опять же позиции всех компонентов. Надо искать флаг отключения пересчета на время обновления. А вообще я бы немного по другому делал бы. накидал бы на форму Panel-ов с невидимым бордером, на каждую строчку,поставил бы им алигн вверх, а внутрь панела уже бы совал контролы. Хотя все рано протормаживало бы без отключения пересчета и перерисовки даже на unmanaged.
0
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
08.10.2015, 23:40  [ТС] #8
Storm23 добавьте ряд кнопочек - удаление всей строки, а не элемента в строке, покрутим )

Добавлено через 4 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
скорее всего в том что при изменении координаты форма пересчитывает свой скролпос
скролпос это если есть прокрутка ? если о ней речь, то нет. Разворачиваю на весь экран, одно и то же. Просто тормозит именно при перерисовке всех контролов , я жму чаще чем оно успевает перерисовать, уже и не жму а оно еще перерисовывает несколько раз.
0
Fulcrum_013
Заблокирован
08.10.2015, 23:49 #9
Цитата Сообщение от Askfor Посмотреть сообщение
росто тормозит именно при перерисовке всех контролов , я жму чаще чем оно успевает перерисовать, уже и не жму а оно еще перерисовывает несколько раз.
Скачал, запустил. Куда не добавляю - никаких лагов. Комп не самый шустрый - I3-2120, винда правда 10-я, навероное что то в .Net подправили.
0
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
08.10.2015, 23:57  [ТС] #10
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Скачал, запустил. Куда не добавляю - никаких лагов.
Если не удалять всю строку лагов и не будет, т.к. не надо перерисовывать другие. Я тоже так могу сделать но толку то, мне надо удалять всю строку. Там видели FastVirtualGrid.dll прикручено чего то ) я не знаю что это.
0
Fulcrum_013
Заблокирован
09.10.2015, 00:09 #11
Цитата Сообщение от Askfor Посмотреть сообщение
Если не удалять всю строку лагов и не будет, т.к. не надо перерисовывать другие.
Попробуйте контролы засовывать в панели. тогда будет удаляться панель, соответственно пересчета в разы меньше.
Кстати при добавлении строки точно так же все остальные перерисовываются.
Цитата Сообщение от Askfor Посмотреть сообщение
Там видели FastVirtualGrid.dll прикручено чего то ) я не знаю что это.
я так подозреваю что это unmanaged компонент для быстрой таблицы.
1
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
09.10.2015, 00:15  [ТС] #12
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Попробуйте контролы засовывать в панели. тогда будет удаляться панель, соответственно пересчета в разы меньше.
Вот это попробую конечно, но чем оно отличается от тех же алигнов которые пересчитываются. Предполагаю что все что на панели будет тоже пересчитываться относительно панели.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
я так подозреваю что это unmanaged компонент для быстрой таблицы.
Не силен в этом да и вобще не силен ) , где почитать про unmanaged.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Кстати при добавлении строки точно так же все остальные перерисовываются.
В середину ? например после первой строки.
0
Fulcrum_013
Заблокирован
09.10.2015, 00:22 #13
Лучший ответ Сообщение было отмечено Askfor как решение

Решение

Цитата Сообщение от Askfor Посмотреть сообщение
В середину ? например после первой строки.
Иа хоть после 1-ой хоть после 500-ой.
Цитата Сообщение от Askfor Посмотреть сообщение
Не силен в этом да и вобще не силен ) , где почитать про unmanaged.
unmanaged - это без net. на нативном C++.

Добавлено через 3 минуты
Цитата Сообщение от Askfor Посмотреть сообщение
Предполагаю что все что на панели будет тоже пересчитываться относительно панели.
Только во первых пересчитываться они будут один раз на добавление. А то у вас получается пересчет всего на каждое изменение координаты. т.е вы одному контролу координату поменяли, все 500 пересчитались. 2-ому поменяли еще раз все 500 пересчитались. А так добавление/удаление поля остальные строки вообще не трогают. Добавление/удаление строки будет один раз вызывать пересчет только панелов, которых в разы меньше чем контролов.
1
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
12.10.2015, 21:47  [ТС] #14
С помощью панельки проблема частично решилась. Частично , потому что для моего количества элементов, примерно 500, достаточно нормально все работает. До 1000 в принципе работает терпимо. Если надо больше то нужно искать другие варианты.
0
Fulcrum_013
Заблокирован
12.10.2015, 22:50 #15
Цитата Сообщение от Askfor Посмотреть сообщение
Если надо больше то нужно искать другие варианты.
Делать из грида. У него нет реалигна элементов. Не знаю есть ли в WindowsForms возможность вставлять свои контролы в ячейки грида, но под VCL к примеру возможности нет, но есть возможность написать компонент на базе грида в котором эта возможность будет.
Еще вариант - искать флаг отключения имплементации изменений формой, на время перетасовки контролов, чтобы она выполняла пересчет координат только после того как все координаты расставлены.
0
Askfor
25 / 25 / 9
Регистрация: 07.08.2012
Сообщений: 134
Завершенные тесты: 3
15.10.2015, 22:05  [ТС] #16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Делать из грида.
TableLayoutPanel специально для этого, но просто я не хотел ей пользоваться.
0
Fulcrum_013
Заблокирован
16.10.2015, 17:04 #17
Цитата Сообщение от Askfor Посмотреть сообщение
TableLayoutPanel специально для этого, но просто я не хотел ей пользоваться.
Я вообще StringGrid или DrawGrid имел в виду. Но если есть LayoutPanel почему бы не воспользоваться ей особенно с учетом того что визуально будет не отличимо?
0
16.10.2015, 17:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2015, 17:04
Привет! Вот еще темы с решениями:

Изменение состояния контролов из вторичного потока
Здравствуйте, Столкнулся с такой проблемой: Имеется программа которая ищет...

Правильное изменение контролов при масштабировании
Добрый день, товарищи. Возник некоторый затык во вроде бы банальной задаче....

Изменение свойств контролов по массиву имен
Допустим у меня есть 1024 кнопки и у всех их visible=false и имена у них...

Изменение размеров и перетаскивание контролов во время выполнения программы
День добрый! Кто нибудь сталкивался с таким вопросом? Я нашел, вот такую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru