Okienka i przekazywanie wartosci formatek pomiedzy klasami

0

Jako, ze akurat cwicze sobie mysqla w C# to podam przykladowy kod z moim problemem dotyczacy mysqla, ale prosze sie tym nie sugerowac, na razie nie chodzi o mysqla;)

namespace winMysql2 {
    public partial class Form1 : Form {
        private bazaDanych sql = new bazaDanych();

        public Form1() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            toolStripStatusLabel1.Text = "Tworzę połączenie...";
            sql.pobierz(ref dataGridView1, ref toolStripStatusLabel1);
        }

        private void Form1_Load(object sender, EventArgs e) {
        }
    }
}

class bazaDanych : Form {
    private MySqlConnection polaczenie;
    private ToolStripStatusLabel oStatus;
    private DataGridView grid;

    public bazaDanych() {
        this.polacz();
    }

    public void polacz() {
	// (...)
    }

    public void pobierz(ref DataGridView _grid, ref ToolStripStatusLabel _status) {
        grid = _grid;
        oStatus = _status;
        try {
            oStatus.Text = "Nawiązano połączenie z serwerem MySQL";
        }
        catch(System.Exception ex) {
            MessageBox.Show(this, "Blad podczas proby nawiazania polaczenia z baza MySQL", "caption", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        string _zapytanie = "SELECT * FROM klienci";
        MySqlDataAdapter zapytanie = new MySqlDataAdapter(_zapytanie, this.polaczenie);
        MySqlCommandBuilder pytanie = new MySqlCommandBuilder(zapytanie);

        try {
            DataTable dane = new DataTable();
            zapytanie.Fill(dane);
            grid.DataSource = dane;
            grid.Columns[0].Visible = false;
            oStatus.Text = "";
        }
        catch(System.Exception ex) {
            MessageBox.Show("Blad podczas pobierania danych z bazy: " + ex.Message);
        }
    }
}

Pytanie - czy jest rozsadniejszy lub wygodniejszy sposob na przekazywanie konkretnych obiektow od referencji do poszczegolnych "obiektow formatki" lub jak zrobic w moim przypadku referencje do calej "formatki" (klasy Form1), ktora zawiera wszystkie obiekty na formatce?

Dodam, ze bazaDanych(ref Form Form1) oczywiscie nie dziala, a niezbyt usmiecha mi sie podawanie kilkunastu argumentow dla metody;/

0

Jak chcesz przekazać referencję do formy samej formy tylko, że innej to po prostu w jej konstruktorze przekazujesz this:

class MyForm : Form
{
    private Form1 frm;    

    public MyForm(Form1 frm)
    {
        this.frm = frm;
        // teraz masz dostęp do publicznych składowych obiektu `frm`
    }
}

class Form1 : Form
{
    public int pole1 = 0;

    public Form1()
    {
        // ...
        new MyForm(this).Show();
    }
}
0

No niestety, to nie chce byc takie proste...

0

To może być takie proste, ale niekoniecznie eleganckie.

Po pierwsze, pousuwaj te wszystkie refy, to nie c++ - i tak przekazujesz referencję do tych obiektów (polecam w tej kwestii artykuł, który traktuje o parametrach, wartościach i referencjach w c#: http://www.yoda.arachsys.com/csharp/parameters.html).

Po drugie - możesz zrobić prosto, jak kolega xeo(cyferki) proponuje, tylko musisz w properties poprzestawiać, żeby te kontrolki były public a nie private. To jest rozwiązanie proste, skuteczne i zalecane do małego projektu pod poduchę, ale definitywnie nie jest eleganckie.

W miarę elegancko to powinieneś bo, zrobić sobie w tej Form1 publiczne metody odpowiadające za właściwe zmiany w kontrolkach i przekazywać form1 tak, jak xeo(cyferki) napisał. Być może jeszcze więcej sensu będzie miało, jeśli to okienko bazaDanych będzie udostępniało metodę, która zwróci dane potrzebne do aktualizacji kontrolek, a Form1 odpyta bazaDanych wtedy, kiedy będzie potrzebowało tych informacji (wtedy np. metoda pobierz powinna coś zwracać i być wywoływana wewnątrz Form1).

0

Kolejna sprawa na rzecz poprawienia elegancji, to jest oddzielenie logiki aplikacji od GUI. W tym przypadku będzie to utworzenie osobnej klasy do połączenia z bazą danych, a w oknie tylko wprowadzanie i wyświetlanie danych.

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