Aktualizacja komponentu Form (ProgressBar) z oddzielnej klasy

0

Jako, że udało mi się opracować aplikację w trybie konsolowym chcę przerobić ją teraz na tryb okienkowy. I tutaj pojawia się problem.

Otóż chciałbym dołączyć do formatki komponent "ProgressBar" aby sprawdzać jak długo jeszcze będzie działała pętla, ale niestety wartość, która jest przekazywana do parametru "Value" komponentu "ProgressBar" obliczana jest w osobnej klasie (klasa OperacjaNaBazie -> metoda Sortuj()).

I tutaj rodzi się pytanie, czy da się w prosty sposób przekazać referencję do utworzonego obiektu "gl" klasy "Glowna" do innej klasy (OperacjeNaBazie), w taki sposób, żeby przy każdorazowej zmianie wartości w metodzie "Sortuj" aktualizował się komponent "ProgresBar" klasy "Glowna"?

Siedziałem nad tym problemem kilka godzin, niestety nie udało mi się z tym uporać :/ Proszę o pomoc.

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

namespace Program
{
    public partial class Glowna : Form
    {
		List<Osoba> student = new List<Osoba>();
		
        public Glowna()
        {
            InitializeComponent();
        }
		
		[STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Glowna gl = new Glowna();  //  <- jak przekazać referencję do obiektu "gl" do innej klasy (w moim przypadku do klasy OperacjaNaBazie -> metoda Sortuj)?
            Application.Run(gl);
        }


		public void Start()  // <- ta metoda wywoływana jest z innej metody
		{
			OperacjeNaBazie.Sortuj(ref student, ref gl);  // wiem, to nie przejdzie, bo "gl" jest niewidoczne w tej metodzie, ale coś takiego chciałbym osiągnąć
		}

	}

}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Program
{
    public class OperacjeNaBazie
    {
       public static void Sortuj(ref List<Osoba> osoba, ref Glowna glowna)
        {
		for (int i = 0; i < osoba.Count; i++)
            {
            glowna.progressBar1.Value = ((100 * i) / osoba.Count); // <- stąd ma być pobierana wartość do komponentu ProgressBar klasy Glowna
            }   
		}
	}
}
1

Założmy w klasie Glowna mamy metodę po kliknięciu przycisku, która posortuje

 
public partial class Glowna : Form
{
public Glowna()
{
      InitializeComponent();
}
private void ClickButton1(object sender, EventArgs e)
{
      OperacjeNaBazie(student, this)
}
}
0

Nie sądziłem, że będzie to takie proste, bardzo dziękuję za pomoc! Program działa tak jak chciałem. Wystarczyło poprawić kod w dwóch miejscach:

public void Start() 
{
OperacjeNaBazie.Sortuj(ref student, this); // zastąpienie "ref gl" słowem kluczowym "this"
}

oraz

public static void Sortuj(ref List<Osoba> osoba, Glowna glowna) // usunięcie słowa kluczowego "ref"
{
(...)
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1