Zapisanie danych po zamknięciu "form'a"

0

Na początku chciałbym się przywitać jako że jest to mój pierwszy post na forum i prosić o wyrozumiałość z racji tego że jest jestem totalnie początkującym.

Wracając do tematu. Sprawa wygląda następująco. Chcę przekazać wprowadzone dane znajdujące się w Form2 do klasy bazowej, która nie jest formatką. Dane te wykorzystywane będą w kolejnych klasach. Wszystko jest ok do momentu (tak mi się wydaje) zamknięcia Form2. Rozumiem że dane przeze mnie wprowadzone "ulatniają się" z momentem zamknięcia Form2. Co zrobić aby podtrzymać dane po zamknięciu formularza?

  

RysunekPogladowy rysunekPogladowy;
       
        
        public Form2()
        {
            InitializeComponent();
            
            rysunekPogladowy = new RysunekPogladowy((double)wymiarA.Value);

            }

 private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            Form1 obrazek1 = new Form1();
                obrazek1.Show();
        }

 private void wymiarA_ValueChanged(object sender, EventArgs e)
        {
//kontrolka numeric majaca na celu pobranie wymiaruA
            rysunekPogladowy.wymiarAforAll = (double)wymiarA.Value;
       
        }
        
 class RysunekPogladowy:Dane
    {
        public RysunekPogladowy(double wymiarAforAll);


        {
            this.wymiarAforAll = wymiarAforAll;
         }
     }
//Reszta kodu odpowiadajaca za liczenie konktretnych wartosci
        }

//Klasa służaca jako bazowa reszcie klas
abstract class Dane
    {
        
        
        private double wymiarA;
        public double wymiarAforAll
        {
            get
            {
                return wymiarA;
            }
            set
            {
                wymiarA = value;
            }
        


        private double drutforsOne;
        public double DrutforsOne
        {
            get
            {
                return drutforsOne;
            }
            set
            {
                drutforsOne = value;
            }
        }

Miejsce w którym potrzebny jest wymiarA z Form2


// Miejsce w którym potrzebny jest wymiarA z Form2
class UzwojeniePierwotne : Dane
    {
        private double CalculateZwojeNaWarstwe()
        {

            double ZwojeNaWarstwe = wymiarAforAll/drutforsOne;
            return ZwojeNaWarstwe;
        }
        public double ResultOfZwojeNaWarstweUP
        {
            get
            {
                double resultOfZwojeNaWarstwe = CalculateZwojeNaWarstwe();
                return resultOfZwojeNaWarstwe; 
            }

        } 
} 

Ostatecznie wynik ma być wyświetlany w labelu w Form1.
Chciałem rozwiązać to poprzez dodanie przycisku do Form2 umożliwiającego "zapisanie danych"(no właśnie jak to zrobić?), które będą wykorzystywane w dalszych obliczeniach. No ale na początku chciałem się dowiedzieć czy sam tok mojego rozumowania jest poprawny.

2

W skrócie chodzi o to, że:
Musisz otworzyć form2 jako formę modalną. Musisz jakoś pobrać z niej dane, a więc chodzi o to, żeby do form2 przekazać obiekt albo referencję do tych Twoich danych. Możesz pokombinować sam, a jeśli nie dasz rady, to poniżej prawie gotowiec:

 
//kod formy 2:
public class Form2: Form
{
  public static bool GetTheData(ref int wartoscInt)
  {
    form2 = new Form2();
    bool result = false;

    ModalResult mr = form2.ShowDialog();
    if(mr == ModalResult.OK)
    {
       result = true;
       wartoscInt = Convert.ToInt32(form2.wartoscEdit.Text);
    }

    form2.Dispose();
    return result;
  }
}


//wywołujesz to tak:
int mojeDane = 0;
if(Form2.GetTheData(ref mojeDane)
{
  //coś do zrobienia dalej
}

Kod jest pisany z palca, więc coś tam się może nie kompilować, ale chodzi tu o zasadę. Jak zrobić to dobrze.
Kod zakłada też, że:

  • na formie masz edita nazwanego wartoscEdit, do którego użytkownik wpisuje liczbę całkowitą
  • na formie masz dwa przyciski - OK i ANULUJ. Wciśnięcie OK, zamyka okienko z rezultatem modalnym OK, a Anuluj z rezultatem CANCEL. Jeśli nie wiesz, o czym mówię - google + "C# modal dialog"

Po wciśnięciu OK, GetTheData zwróci TRUE, a po anuluj, zwróci FALSE.

Jeśli potrzebujesz kilka danych, a nie tylko jednego inta, to ujmij je w jakąś strukturę.

0

Dzięki za pomoc. Koniec końców skorzystałem z wklejonego przez Ciebie kodu i otrzymałem zasadniczo to co chciałem(niestety moje próby okazały się bezowocne).

To znaczy po wprowadzeniu danych do kontrolki i wciśnięciu przycisku OK przesyłam daną do klasy gdzie ma się znajdować. Przy czym nie rozumiem chyba w 100% zasady działania tego kodu bądź też dialogu modalnego pomiędzy dwoma formami.Myślałem że jest to swego rodzaju pętla która wykonuje się w nieskończoność.To znaczy wpisanie wartości do Textboxa a następnie wciśnięcie OK spowoduje zwrócenie wartości TRUE i przeniesienie do Form1 gdzie wyświetlany jest wynik. Wciśnięcie przycisku button1 na Form1 spowoduje pokazanie się Form2 gdzie możliwe będzie wpisanie wartości do Textboxa, wywołanie metody GetTheData i ponowne przekazanie zawartości TextBoxa do zmiennej w klasie ModalResult. Problem polega na tym że dzieje się tak tylko w przypadku pierwszego wykonania programu(pierwszego wprowadzenia danych do TextBoxa)

Czy problemem jest to że metoda GetTheData jest statyczna i muszę przerobić ją na zwykłą metodę ? Czy też muszę napisać kod dla przycisku znajdującego się w form1,który będzie zerował zmienną w,której przechowywana jest zawartość textBoxa z Form2. Bądź też problem leży gdzie indziej a ja zupełnie nie kumam zagadnienia.

public partial class Form2 : Form
    {
        
        public Form2()
        {
            InitializeComponent();
        }
        public decimal xResult;
       
        public static  bool GetTheData(ref decimal xResult)
        {
            Form2 frm2 = new Form2();
            
            bool result = false;

            DialogResult dr = new DialogResult();
            
            dr = frm2.ShowDialog();

            if (dr == DialogResult.OK)
            {
                result = true;
                xResult = Convert.ToDecimal(frm2.textBox1.Text);
            }
            if (dr==DialogResult.Cancel)
            {
                result = false;
            }
            frm2.Dispose();
            return result;
        }
     
	

	
            
    } 
 public partial class Form1 : Form
    {
        ModalResult modal = new ModalResult();
        public Form1()
        {
            InitializeComponent();
            display();

        }

        
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            
            
            if (frm2.ShowDialog() == DialogResult.OK)
            {
                
               
            }
        }
        private void display()
        {
            decimal Display = modal.WynikForAll;
            label1.Text = Display.ToString();
        }
       
       
    }
class ModalResult : Form2
    {
        private decimal wynik;
        public decimal WynikForAll
        {
            get
            {
                decimal MojeDane = 0;
                if (Form2.GetTheData(ref MojeDane))
                {
                    wynik = MojeDane;

                }
                return MojeDane;
            }
            

        }


    } 
0

Po pierwsze po co robisz:

 
DialogResult dr = new DialogResult();

To jest bez sensu. Powinno być:

DialogResult dr = frm2.ShowDialog();

Poza tym nakombinowałeś tutaj strasznie.
Po pierwsze, nie ogarniasz, czym są metody statyczne. Więc poczytaj o metodach statycznych. Jak już będziesz wiedział, zrozumiesz, że kod:

private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
 
 
            if (frm2.ShowDialog() == DialogResult.OK)
            {
 
 
            }
        }

nie ma żadnego sensu.
Tak samo jak ta klasa ModalResult dziedzicząca po formie...

Jeszcze raz.

Masz formę do wpisania jakiś tam ustawień. Klasa tej formy to Form2, z tego co widzę.
Tam masz mieć statyczną metodę (GetTheData), która sama tworzy Ci instancję tej klasy:

Form2 frm2 = new Form2();

Żadnej formy ModalResult, żadnego więcej tworzenia form2.
Po prostu:

if(Form2.GetTheData(ref data)
{

}

i tyle.

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