Как мне сделать, чтобы похожие несколько панелей графического интерфейса отображались в моем приложении Windows Form

#c#

#c#

Вопрос:

У меня есть приложение Windows form на c #, которое имеет функциональность, аналогичную графическому интерфейсу MSN. Это работает таким образом, что появляется только окно уведомлений, если есть уведомление, которое в этом случае я поместил несколько кнопок и других элементов в одну панель. (это правильный способ сделать это?)

Как мне закодировать его так, чтобы я мог использовать ArrayList для добавления похожих панелей в список и использовать цикл for для его вызова. Примером может быть вызов 2 или 3 похожих панелей с помощью arraylist(?) и чтобы они отображались друг под другом. (Может быть, например, как окно уведомлений MSN появляется одно над другим.)

код для панели

             this.panel1.Controls.Add(this.button1);
            this.panel1.Controls.Add(this.lblImage);
            this.panel1.Controls.Add(this.lblName);
            this.panel1.Controls.Add(this.lblLinkName);
            this.panel1.Controls.Add(this.lblLinkLocation);
            this.panel1.Controls.Add(this.lblLocation);
            this.panel1.Location = new System.Drawing.Point(13, 134);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(506, 100);
            this.panel1.TabIndex = 17;
 

должен ли я кодировать цикл for в файле конструктора или файле кодирования? поскольку после того, как я попытался добавить цикл for в файл кода конструктора, представление конструктора не смогло отобразить мой пользовательский интерфейс.

Комментарии:

1. Можете ли вы предоставить дополнительные разъяснения? Есть ли какая-нибудь примерная ссылка, которую вы хотите создать?

2. Вы просто пытаетесь добавить несколько панелей, все с одинаковыми кнопками, метками и размером, но с разными местоположениями и индексами вкладок?

3. @дэрил: да, это то, что я пытаюсь сделать. все аналогично, но в другом месте.

4. Это то, для чего был создан UserControl.

Ответ №1:

Я предполагаю, что это то, что вы ищете

 for(int i = 0; i < panels.length; i  ){
    AddPanel(panels[i], i);
}

AddPanel(System.Drawing.Point point, int tabIndex){
    Panel panel = new Panel();
    this.Add(panel);
    panel.Controls.Add(new Button());
    panel.Controls.Add(new Label("Image"));
    panel.Controls.Add(new Label("Name"));
    panel.Controls.Add(new Label("linkName"));
    panel.Controls.Add(new Label("linkLocation"));
    panel.Controls.Add(new Label("location"));
    panel.Location = point;
    panel.Name = "panel"   i.ToString();
    panel.Size = new System.Drawing.Size(506, 100);
    panel.TabIndex = tabIndex;
}
 

Вам нужно будет заполнить массив panels точками, в которые вы хотели бы добавить свои панели.

Комментарии:

1. привет. спасибо за ответ. как мне указать точку, в которой они должны быть добавлены для разных панелей?

2. и все эти коды должны быть помещены в файл конструктора или файл cs?

3. @Thomas Просто создайте свой массив и добавьте свои точки, в которых вы хотите, чтобы ваши панели отображались… Point[] panels = new Point[] { новая точка (0, 0), новая точка (100, 0), новая точка (0, 100), новая точка (100, 100)}; Не помещайте его в файл конструктора, потому что VS удалит его, или он будетотключите редактор. Он отправляется в файл form.cs после метода InitializeComponents().

Ответ №2:

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

Вы можете создать несколько экземпляров пользовательского элемента управления и добавить их в список, а также прикрепить к ним обработчики событий и т.д…

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

добавление примера

С помощью пользовательского элемента управления ListItem.

 ListItem item = new ListItem();
someFlowPanel.controls.add(item);
 

Вероятно, вам следует установить ширину элемента на ширину панели потока, к которой вы его добавляете, и установить для нее привязку влево и вправо.

Комментарии:

1. привет, спасибо за ответ. как мне добавить к нему каждый экземпляр пользовательского элемента управления? означает ли это, что я могу добавить несколько панелей похожих меток кнопок и кнопок на панель компоновки потока?

2. Если вы сгруппируете все свои элементы управления, которые хотите повторить для каждого элемента, в пользовательском элементе управления, вы можете обрабатывать их все как один сгруппированный элемент. У вас может быть столько экземпляров вашего пользовательского элемента управления, сколько вам нравится.

3. привет, я полагаю, что все это должно быть закодировано в файле конструктора или в файле cs?

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