Как периодически добавлять / обновлять элементы в существующий список? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь изменить (добавить или удалить) элементы комбинированного списка, пока форма уже запущена, я попробовал метод add this.comboBox1.Items.add("test2");, но он добавляет элемент, только если он запускается до Application.Run(form);.

Почему не происходит обновление / добавление элемента в выпадающий список?

Form1.designer.cs:

namespace WindowsFormsApp1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        private void InitializeComponent()
        {
            this.comboBox1 = new System.Windows.Forms.ComboBox();
            this.SuspendLayout();
            // 
            // comboBox1
            // 
            this.comboBox1.FormattingEnabled = true;
            this.comboBox1.Items.AddRange(new object[] {
            "test"});
            this.comboBox1.Location = new System.Drawing.Point(422, 116);
            this.comboBox1.Name = "comboBox1";
            this.comboBox1.Size = new System.Drawing.Size(121, 24);
            this.comboBox1.TabIndex = 0;
            this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.comboBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        public void test() {
            this.comboBox1.Items.add("test2");
        }

        #endregion

        private System.Windows.Forms.ComboBox comboBox1;
    }
}

Form1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();

            Application.Run(form);
            form.test();

        }
    }
}

РЕДАКТИРОВАТЬ

Как добиться периодического обновления предметы по функции?

Ответы [ 4 ]

1 голос
/ 20 марта 2020

Я нашел очень полезную функцию, которая timers .

Я использовал таймер, инициализированный внутри конструктора формы, чтобы периодически обновлять комбинированный список, в следующем примере он добавил элемент, который является текущим временем для выпадающего списка каждые 2 секунды 5 раз:

Form1.Designer.cs:

namespace WindowsFormsApp1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }


        private void InitializeComponent()
        {
            this.comboBox1 = new System.Windows.Forms.ComboBox();
            this.timer1 = new System.Windows.Forms.Timer();

            this.SuspendLayout();
            // 
            // comboBox1
            // 
            this.comboBox1.FormattingEnabled = true;
            this.comboBox1.Items.AddRange(new object[] {
            "test"});
            this.comboBox1.Location = new System.Drawing.Point(422, 116);
            this.comboBox1.Name = "comboBox1";
            this.comboBox1.Size = new System.Drawing.Size(121, 24);
            this.comboBox1.TabIndex = 0;
            this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.comboBox1);
            this.Name = "Form1";
            this.Text = "Form1";

            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.ComboBox comboBox1;
        private System.Windows.Forms.Timer timer1;

    }
}

Form1.cs

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeTimer();
        }


        private void InitializeTimer()
        {
            counter = 0;

            timer1.Interval = 2000;
            timer1.Enabled = true;

            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
        }

        private void timer1_Tick(object sender, System.EventArgs e)
        {
            if (counter >= 5)
            {
                // Exit loop code.  
                timer1.Enabled = false;
                counter = 0;
            }
            else
            {
                // Run your procedure here.  
                // Increment counter.  
                counter = counter + 1;
                this.comboBox1.Items.Add(DateTime.Now.ToString("h:mm:ss tt"));
            }
        }
1 голос
/ 20 марта 2020

Код, сгенерированный дизайнером, должен изменяться только конечными пользователями при очень определенных c обстоятельствах, и я не верю, что это один из них. Также этот тип вызова метода не относится к Program.cs.

. Причина, по которой ваш вызов метода не работает, заключается в том, что вы помещаете его в Program.cs. Когда ваш Program.cs вызывает Application.Run(), он начинает сообщение l oop в текущем потоке с указанной формой (в данном случае Form1). Form1 блокирует выполнение в Program.cs до его закрытия. После закрытия Form1 выполнение продолжается в Program.cs. Другими словами, только после закрытия Form1 вызывается test().

Чтобы исправить эту проблему, сначала переместите метод test() с Designer на Form1.cs. Затем переместите вызов метода test() в конструктор Form1 (public Form1() in Form1.cs). В качестве альтернативы, создайте другое событие / метод в Form1.cs (возможно, Load() метод) и запустите test() там.

0 голосов
/ 20 марта 2020

Вы также можете использовать его для добавления элемента с функцией

Пример:

        public Form1()
        {
            InitializeComponent();
            AddTenItems();
        }
        List<string> itemList = new List<string>();
        int i=0;
        private void button1_Click(object sender, EventArgs e)
        {
            itemList.Add("Test N° "+i);
            i++;
        }
        private void AddTenItems()
        {
            for(int i=0; i<10; i++)
            {
                itemList.Add("Added N°" + i);
            }
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();

            foreach(string item in itemList)
            {
                comboBox1.Items.Add(item);
            }

        }

enter image description here

0 голосов
/ 20 марта 2020

Вместо использования SelectIndexChanged следует использовать событие щелчка

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

, возможно, не лучший подход, но он отлично работает

 List<string> itemList = new List<string>();
        int i=0;
        private void button1_Click(object sender, EventArgs e)
        {
            i++;
            itemList.Add("Test N° "+i);
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();

            foreach(string item in itemList)
            {
                comboBox1.Items.Add(item);
            }

        }

enter image description here

И ваша программа не очень хорошо сделана, Form1.cs.designer используется для создания пользовательского интерфейса (пользовательский интерфейс ) вашей программы, вы НЕ ДОЛЖНЫ добавлять сюда свою функцию.

FormX.cs.designer = UI, design

FormX.cs = functions

Programm.cs = определено какой FormX.cs будет запущен первым (новый (Form1))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...