kuharan Ответов: 2

Управление индикатором выполнения родительской формы из дочерней формы.


Всем Привет,

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

Я установил модификаторы в Public и написал эти строки кода. И все же я не мог сделать это возможным.

Форма 1:

private void button1_Click(object sender, EventArgs e){

Form2 f2 = new Form2();
f2.Show();
}


Форма 2:

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            Form1 f1 = new Form1();
            int j;
            for (j = 0; j < 100; j++)
            {
                f1.progressBar1.Value = j;
                f1.progressBar1.Refresh();
                f1.progressBar1.Update();
                Console.WriteLine("j={0}", j);
            }
        }
    }


Что я уже пробовал:

Также попробовал связать код формы 2 с событием кнопки.

public partial class Form2 : Form
    {
        Form1 f1 = new Form1();
        public Form2()
        {
            InitializeComponent();
            
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int j;
            for (j = 0; j < 100; j++)
            {
                f1.progressBar1.Value = j;
                f1.progressBar1.Refresh();
                f1.progressBar1.Update();
                Console.WriteLine("j={0}", j);
            }
        }
    }

[no name]

Вы действительно знаете, что делает "Form1 f1 = new Form1 ();"?

kuharan

объект или экземпляр form1

[no name]

Другими словами, нет. Он создает новый, никогда ранее не виданный и не рассматриваемый экземпляр объекта, который не имеет ничего общего с существующими экземплярами.

kuharan

Да, я ошибался в создании новых объектов. Спасибо.

2 Ответов

Рейтинг:
8

Karthik_Mahalingam

пробовать

Форма 1

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

        public void UpdateProgress(int j) { // public method to invoke from the child form
            this.progressBar1.Value = j;
            this.progressBar1.Refresh();
            this.progressBar1.Update(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            Form2 f2 = new Form2();
            f2.ParentFormObject = this; // pass the parent form object 
            f2.Show();
        }
    }


Форма 2

public Form1 ParentFormObject { get; set; } // to access parent form object
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int j;
            for (j = 0; j < 100; j++)
                ParentFormObject.UpdateProgress(j); // access the parent form public method
        }


Рейтинг:
1

OriginalGriff

Посмотрите на свой код:

public Form2()
{
    InitializeComponent();
    Form1 f1 = new Form1();

Когда вы создаете new экземпляр чего-либо, это именно то, что вы получаете: a 't get new object. Вы не получаете копию существующего, вы не получаете ссылку на существующий-вы получаете совершенно новый.
Вы не можете делать это, как это!

И то, что вы пытаетесь сделать, неправильно, очень неправильно - "дочерняя" форма не должна даже знать, что" родитель " существует: вот почему элементы управления private для начала-чтобы ваш "внешний мир" не мог с ними играть!

Сделайте индикатор выполнения Form1 снова закрытым и создайте событие в Form2, которое Form1 обрабатывает для указания прогресса: Передача информации между двумя формами, Часть 2: Ребенок-Родитель[^] должен помочь и дает пример.


kuharan

Я сделал это публично, чтобы проверить.

Dave Kreskowiak

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

kuharan

да, я понял . Спасибо