Chart - czyszczenie i aktualizacja danych z innego formularza

0

Witam,

Próbuję po wprowadzeniu danych do bazy danych wyczyścić aktualny chart i go zaktualizować o nowe dane.

Wszystko działa z poziomu formularza na którym jest Chart, ale ja potrzebuje go odświeżyć z poziomu innego formularza.

Próbowałem tworzyć nowy obiekt, zmienić uprawnienia (Modifiers na public), aby odwołać się bezpośrednio do Charta, ale nie działa żaden sposób.

Przy próbie wywołania metody poprzez -> Formularz1 form = Owner as Formularz1; //występuje pusta referencja (Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu)

Czy ktoś to może przerabiał? Jak to rozwiązać? Nie mam już pomysłów.

1

Bo Owner nie jest obiektem klasy Formularz1 (cóż za piękna nazwa dla klasy).

Czy ktoś to przerabiał? Hm... No właśnie. Czy ktoś to przerabiał?

Ja mam wrażenie, że to pytanie (dostęp do czegoś na Form z innego Form) jest tu tak często, że to powinien być test na możliwość pisania postów tutaj. Nie wiesz jak to możesz tylko czytać.

Odpowiedzi tez chyba wszystkie padły. Od przekazania referencji Form1 do Form2, przez osobne klasy do użycia event-ów.

No ale ponieważ u mnie właśnie wyszło słońce to podam jedno z najgorszych i najłatwiejszych zarazem rozwiązań.

Przekaż referencję Form1 do Form2 czyli

Dodaj konstruktor Form2 z referencję do Form1

public class Form2
{
  private Form1 form1;
  
  public Form2(Form1 _form1){
  form1 = _form1;
  }
}

private ResetChart()
{
  form1.Chart.clear(); // czy co tam chcesz z tym chartem zrobić, nie używam tego charta
}

Oczywiście chart musi mieć Modifers na public, ale to wiesz.

wtedy jak tworzysz okno Form2 w Form1 używasz tego konstruktora.

var f = new Form2(this);
...

0

@jacek.placek: Dziękuję za info i pomoc. Mam nadzieje, że jest jeszcze u Ciebie trochę słońca bo nie do końca jest tak jak chciałem.

Oczywiście zadziałało, tylko wykres czyści mi się każdorazowo przy uruchomieniu okna za każdym razem, ponieważ wywołanie ( var f = new Form2(this)) jest umieszczone w konstruktorze Form1

Ja potrzebuje, aby ten wykres aktualizował się, np. po wykonaniu jakiegoś zadania (metody) lub najprościej po naciśnięciu przycisku w Form2.

0

Niestety słońce już zaszło.
Ale jest ciepły wieczór więc...

W form 2 dodaj pole
Private Formularz1 form1;
W konstruktorze form 2 przepisz referencje do Formularz1.
Public Formularz2(Formularz1 _form1)
{
form1=_form1;
I

W Formularz1 dodaj metodę ClearChart() i tam kod czyszczenia

W Formularz2 pod jakimś przyciskiem
form1.ClearChart();

Albo form1.Chart... jeśli Chart w Form1 ma Modifier a Public.

0

@jacek.placek:

Form2:

Private Form1 form1;

public Form2(Form1 _form)
{
form1 = _form;
}

private void Button_Click(object sender, EventArgs e)
{
form1.ClearChart();
}


Form1:

public void ClearChart()
{
Chart.Series["Seria"].Points.Clear();
}

error.png

0

No kurw.
Jak form1 jest null to sprawdź dlaczego.
Breakpoint w konstruktor Form2. Wchodzi tam? A moze tworzysz form2 z bezparametrowym konstrukorem?
Weź pomysl trochę.

0

@jacek.placek:

Poszło na statycznym polu. Nie wiem, czy to dobre wyjście,ale działa.

Form1

public static Form1 Instance { get; set; }

public Form1()
{
InitializeComponent();
Instance = this;
}

public static void ClearChart()
{
Instance.Chart.Series["Seria"].Points.Clear();
}


Form2
Na buttonie wywołanie metody

Form1.ClearChart();

0

Pokaż jak tworzyć form2 i gdzie.

Jak działa to działa. Problem taki, że nie wiesz dlaczego działa lub nie dziala A powinieneś wiedzieć.

0

Skoro formularz jest już otwarty to nie ma sensu tworzyć nowej instancji. Wystarczy odwołać się do metody w formularzu, której chcemy użyć z poziomu innego formularza.

Taki efekt chciałem otrzymać i znalazłem rozwiązanie. Poniżej wrzucam info dla potomnych:

W formularzu z którego chcemy wywołać metodę z innego formularza wrzucamy taki zapis pod przycisk / cokolwiek

if (Application.OpenForms["Form_1"] != null){
(Application.OpenForms["Form_1"] as Form_1).NAZWA_NASZEJ_METODY(); }

W formularzu (FORM_1) w którym chcemy uruchomić metodę po prostu ją tam tworzymy
**
public void NAZWA_NASZEJ_METODY() { Kod, który chcemy uruchomić }
**
Źródło: https://stackoverflow.com/questions/12890754/call-a-method-from-another-form

1

OK to ja się poddaję :)

Napiszę też dla potomnych.
Nie używajcie kodu bez jego rozumienia przynajmniej w podstawowym zakresie. I używajcie debugera. Zawsze.

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