С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
1 / 1 / 0
Регистрация: 31.01.2016
Сообщений: 43
1

Как создать коллекцию элементов на форме

31.01.2016, 05:43. Показов 7857. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Я только начинающий самоучка, перехожу с древнего VB6.
Подскажите пожалуйста: Как правильно создать коллекцию элементов на форме, что бы можно было читать и изменять их свойства из цикла, вызывая по индексу, а не вручную. Я создал как массив, но дизайнер ругается шибко: "Не удалось загрузить дизайнер. Проверьте исходный код на наличие ошибок, а также доступность всех ссылок."

Кликните здесь для просмотра всего текста

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
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace Collection_Test
{
    partial class MainForm
    {
    }   private void InitializeComponent()
        {
            label1 = new System.Windows.Forms.Label[4];
            this.label1[1] = new System.Windows.Forms.Label();
            this.label1[2] = new System.Windows.Forms.Label();
            this.label1[3] = new System.Windows.Forms.Label();
            this.label1[0] = new System.Windows.Forms.Label();
            //...
            //так же как ниже описаны свойства остальных меток label1[1], label1[2], label1[3]
            //...
            this.label1[0].BackColor = System.Drawing.SystemColors.ButtonHighlight;
            this.label1[0].BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.label1[0].Location = new System.Drawing.Point(52, 68);
            this.label1[0].Name = "label1[]";
            this.label1[0].Size = new System.Drawing.Size(114, 25);
            this.label1[0].TabIndex = 6;
            this.label1[0].Text = "label1";
            this.label1[0].TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            
            this.Controls.Add(this.label1[0]);
            this.Controls.Add(this.label1[1]);
            this.Controls.Add(this.label1[2]);
            this.Controls.Add(this.label1[3]);
        }
        private System.Windows.Forms.Label[] label1;
        
}

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2016, 05:43
Ответы с готовыми решениями:

создать коллекцию или массив в форме
Можно ли создать коллекцию или массив в форме1, а в форме2 использовать их элементы? Подскажите...

Создать новый поток на добавление элементов в коллекцию
Доброго времени суток. Имеется приложение которое определяет является ли bitInteger из задаваемого...

Как создать коллекцию для многоуровневой вложенности TreeView
Хочу размещать в trueview коллекцию элементов. Проблема в том, что коллекция получается многократно...

Как создать глобальную коллекцию и вбивать значение по нажатию Button
Привет, форумчане. Столкнулся с непониманием. Есть struct Car и в ней соответственно есть 3...

7
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582
31.01.2016, 09:23 2
Лучший ответ Сообщение было отмечено nik_1712 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
TextBox[] tb = new TextBox[10];
for (int i = 0; i < tb.Length; i++)
{
    tb[i] = new System.Windows.Forms.TextBox();
    tb[i].Location = new System.Drawing.Point(101, 50 + i * 30);
    tb[i].Name = "textBox" + i.ToString();
    tb[i].Size = new System.Drawing.Size(75, 23);
    tb[i].TabIndex = i;
    tb[i].Text = "textBox" + i.ToString();                
    Controls.Add(tb[i]);
}
Аналогично только с меткой.
1
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.01.2016, 12:21 3
Лучший ответ Сообщение было отмечено nik_1712 как решение

Решение

nik_1712,
1) Не меняйте и не пишите ничего в метод InitializeComponent(). Этот метод для дизайнера. Он генерируется автоматически, не трогайте его вообще. Если вдруг вам нужно что то создать динамически на форме - просто сделайте отдельный метод и вызовите его из конструктора формы.
2) Крайне сомнительно что вам нужны циклы по меткам и все такое. Скорее всего вы что то делаете неправильно.
3) Пройтись по всем контролам, лежащим на форме можно так:
C#
1
2
3
4
foreach(Control ctrl in  Controls)
{
  //....
}
4) Обратите внимание на такую вещь как UserControl. Если вам нужны какие-то групповые операции с контролами, возможно нужно просто положить эти контролы в отдельный контрол? Или же использовать отдельные UserControl вместо ваших лейблов?
1
1 / 1 / 0
Регистрация: 31.01.2016
Сообщений: 43
31.01.2016, 15:52  [ТС] 4
Цитата Сообщение от MaxSlim Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
TextBox[] tb = new TextBox[10];
for (int i = 0; i < tb.Length; i++)
{
    tb[i] = new System.Windows.Forms.TextBox();
    tb[i].Location = new System.Drawing.Point(101, 50 + i * 30);
    tb[i].Name = "textBox" + i.ToString();
    tb[i].Size = new System.Drawing.Size(75, 23);
    tb[i].TabIndex = i;
    tb[i].Text = "textBox" + i.ToString();                
    Controls.Add(tb[i]);
}
Аналогично только с меткой.
Спасибо за ответ, но к сожалению не работает.
0
1 / 1 / 0
Регистрация: 31.01.2016
Сообщений: 43
31.01.2016, 16:28  [ТС] 5
Цитата Сообщение от Storm23 Посмотреть сообщение
nik_1712,
1) Не меняйте и не пишите ничего в метод InitializeComponent(). Этот метод для дизайнера. Он генерируется автоматически, не трогайте его вообще. Если вдруг вам нужно что то создать динамически на форме - просто сделайте отдельный метод и вызовите его из конструктора формы.
2) Крайне сомнительно что вам нужны циклы по меткам и все такое. Скорее всего вы что то делаете неправильно.
3) Пройтись по всем контролам, лежащим на форме можно так:
C#
1
2
3
4
foreach(Control ctrl in  Controls)
{
  //....
}
4) Обратите внимание на такую вещь как UserControl. Если вам нужны какие-то групповые операции с контролами, возможно нужно просто положить эти контролы в отдельный контрол? Или же использовать отдельные UserControl вместо ваших лейблов?
Спасибо, но это как? Насколько я понял, это обобщенная формула. А можно уточнить на конкретном примере с конкретными Controls. И если не трогать InitializeComponent(), то куда? Ведь куда я только не пробовал размещать эту задачу, везде ошибка загрузки Дизайнера, хотя откомпилированная прога работает и никаких ошибок не выдает. Но дальнейшим дизайном формы приходится заниматься в слепую, а результат, что где и как смотрится, вижу только во время запуска приложения. С "UserControl" пока не знаком, дайте ссылки, где можно узнать больше об этом. Без циклов никак не обойтись (не при создании лейблов, тут уж как нибудь бы справился копированием и коррекцией), а при присвоении из работающего кода, изменившихся свойств: текста, цвета, и т.п. Хочу переписать на C# свою программу написанную на VB6 и заодно освоить более востребованный и к тому же мульти платформенный C#. Скриншот c программки на VB6 прилагаю, что бы было более понятно зачем нужен доступ к лейблам из цикла.
Миниатюры
Как создать коллекцию элементов на форме  
0
1 / 1 / 0
Регистрация: 31.01.2016
Сообщений: 43
31.01.2016, 18:01  [ТС] 6
Спасибо ответившим. Хоть я и не совсем понял ответы, но скомпилировав в сознании все варианты возможных значений этих ответов, взялся за решение проблемы с новыми силами, и таки нашел те строки в программе, куда следует разместить нужный код. Сейчас все разместил на одной странице ради компактности на странице темы и большей наглядности. Но все же посоветуйте, где мне что почитать на тему создания кода для Windows приложений с графическим интерфейсом и по работе в "SharpDevelop 4", вся литература, которую нарыл раньше, в основном по консольным приложениям. Спасибо всем. Вот, что у меня получилось, хотя здесь вместо лейблов тексты, но главное есть некий шаблон.
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
//
namespace Collection_next
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            //Присвоение свойств коллекции элементов и их создание на форме должно быть именно в "InitializeComponent();" 
            for (int i = 0;  i < 10; i++)
            {
                textBox1[i] = new System.Windows.Forms.TextBox();
                textBox1[i].Location = new System.Drawing.Point(101, 10 + i * 30);
                textBox1[i].Name = "textBox" + i.ToString();
                textBox1[i].Size = new System.Drawing.Size(75, 23);
                textBox1[i].TabIndex = i;
                textBox1[i].Text = "textBox" + i.ToString();  
                Controls.Add(textBox1[i]);              
            }
        }
    }
    partial class MainForm
    {
        private System.ComponentModel.IContainer components = null;
        protected override void Dispose(bool disposing)
        {
            if (disposing) {
                if (components != null) {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }
        private void InitializeComponent()
        {
            textBox1 = new System.Windows.Forms.TextBox[10]; // "textBox1 = new System.Windows.Forms.TextBox[10];"  должно стоять обязательно в этом месте кода
            this.SuspendLayout();
            // MainForm
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 327);
            this.Name = "MainForm";
            this.Text = "Collection_next";
            this.ResumeLayout(false);
        }
        private System.Windows.Forms.TextBox[] textBox1;// "private System.Windows.Forms.TextBox[] textBox1;"  должно стоять обязательно в этом месте кода
    }   
}
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.01.2016, 23:43 7
nik_1712, Почему бы вам не воспользоваться DataGridView для отображения таблицы? Этот контрол как раз для этого и предназначен.
0
1 / 1 / 0
Регистрация: 31.01.2016
Сообщений: 43
01.02.2016, 11:39  [ТС] 8
Спасибо. В будущем подумаю над этим. Но сейчас я хотел бы лучше разобраться с созданием коллекций (или массива? как правильнее?) контролов на форме. Все с этим вроде бы получается (с коллекциями из стандартных контролов), но как только я обращаюсь в очередной раз к конструктору формы, строка инициализации исчезает.
0
01.02.2016, 11:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2016, 11:39
Помогаю со студенческими работами здесь

Как получить коллекцию элементов ListBox
Доброго времени суток. Уважаемые подскажите. Например в textBox, если нам нужен текст который в...

Как получить коллекцию документов из встроенной в форме вьюшке?
Есть задачка сделать отчёт в xls из формы, на форме есть встроенная вьюшка с респонсами дока формы,...

Создать коллекцию из элементов конкретного типа другой коллекции
Есть интерфейс IFood и два класса наследника Fruit и Vegetable. Экземпляры этих классов в...

Создать класс-шаблон, позволяющий хранить коллекцию элементов любого типа
помогите разобраться с этим заданием Создать класс-шаблон, позволяющий хранить коллекцию...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru