Przechodzenie z jednego WindowsForm do kodu z drugiego WindowsForm...

0

Witam,

mam problem z ktorym sie glowie i nie moge go rozwiazac.
Jest to moj pierwszy projekt gdyz dopiero sie ucze, wiec moge robic to wszystko troche "lapotologicznie" .

Ok, Wiec tak.
Mam Form1 na ktorym mam dataGridView oraz przycisk. Kiedy zaznacze wiersz i klikne na przycisk zmieniam status w drugiej kolumnie z "In" na "On Test" i na odwrot. Wszystko to zmieniam w bazie.
Teraz, jesli zmienie ze statusu "On Test" na "In" pojawienia sie nowy formularz w ktorym trzeba wpisac kilka informacji, ktore zostaja zmienione w bazie i wyswietlone w dataGridView. Wiem jak to zrobic, ale z czym mam problem to z tym, ze..... i teraz jest to troche skomplikowane aby tlumaczyc wiec umieszcze kod:

To co mam w formie, ktory pojawia sie, kiedy przechodze ze statusu "On Test" na "In":

 public void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "" || textBox2.Text != "" || comboBox1.Text != "")
            {
                BackFromCalibration.ActiveForm.Close();
                Form1 access = new Form1();
                access.StatusChangeTo_In();
            }
            else
            {
                MessageBox.Show("Enter data");
            }
        }

        public void button2_Click(object sender, EventArgs e)
        {
            BackFromCalibration.ActiveForm.Close();
            Form1 access = new Form1();
            access.RefreshForm();
        }
    }

... jak widac zrobilem tak aby mozna bylo przejsc do Form1 i wywolac "StatusChangeTo_In()", ktory wyglada nastepujaco:

 public void StatusChangeTo_In()
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (dataGridView1.Rows[row.Index].Selected == true)
                {
                    if (dataGridView1.Rows[row.Index].Cells[2].Value.Equals("On Test"))
                    {
                        dataGridView1.Rows[row.Index].Cells[2].Value = "In";
                        //button8.Text = dataGridView1.Rows[row.Index].Cells[1].Value.ToString();
                        int rowIndex = row.Index + 1;
                        string onTestUpdate = "UPDATE CalibrationRegister SET Status = 'In' WHERE RTLG = " + rowIndex;

                        SqlCeConnection cs = new SqlCeConnection(@"DataSource = |DataDirectory|\Database.sdf");
                        SqlCeCommand cmd = new SqlCeCommand(onTestUpdate, cs);
                        cs.Open();
                        cmd.ExecuteNonQuery();
                        cs.Close();

                        this.RefreshForm();
                        Dispose_of_mark();
                    }
                }
            }

...jak widac tutaj powinno zostac zmienione na "In" i tyle. A co sie dzieje to to, ze program przechodzi, tylko do tego momentu:

 public void StatusChangeTo_In()
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)

....po czym przechodzi do kodu z przycisku w ktorym jest:

 private void button8_Click(object sender, EventArgs e)
        {
            //string calibrationStatus;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (dataGridView1.Rows[row.Index].Selected == true)
                {
                    if (dataGridView1.Rows[row.Index].Cells[2].Value.Equals("In"))
                    {
                        dataGridView1.Rows[row.Index].Cells[2].Value = "On Test";
                        //button8.Text = dataGridView1.Rows[row.Index].Cells[1].Value.ToString();
                        int rowIndex = row.Index + 1;
                        string onTestUpdate = "UPDATE CalibrationRegister SET Status = 'On Test' WHERE RTLG = " + rowIndex;

                        SqlCeConnection cs = new SqlCeConnection(@"DataSource = |DataDirectory|\Database.sdf");
                        SqlCeCommand cmd = new SqlCeCommand(onTestUpdate, cs);
                        cs.Open();
                        cmd.ExecuteNonQuery();
                        cs.Close();

                        DialogResult dialogResult = MessageBox.Show("Would you like to send email for qutation?", "Quotation", MessageBoxButtons.YesNo);
                        if (dialogResult == DialogResult.Yes)
                        {
                            
                        }
                        else if (dialogResult == DialogResult.No)
                        {

                        }
                    }
                    else
                    {
                        {
                            BackFromCalibration returnedForm = new BackFromCalibration();
                            returnedForm.ShowDialog();

...przez ten kod przechodzi bez problemu i program konczy swoje dzialanie...

Sumujac, program nie przechodzi przez kod w StatusChangeTo_In(), tylko przechodzi do kodu z przycisku.

Czy moze ktos wie co moze byc nie tak? Domyslam sie, ze narobilem bledow, ktore pewnie gryza sie z zasadami programowania w C#. Dopiero sie ucze, wiec nie bijcie kijami :)....

Z gory dzieki za pomoc.

0

"Łopatologiczne" wytłumaczenie

Form1 access = new Form1();
access.StatusChangeTo_In();

Tworzysz nowy obiekt Form1 wraz z nowym obiektem DataGridView, który nie ma żadnych wierszy. Następnie wywołujesz metodę:

public void StatusChangeTo_In()
{
foreach (DataGridViewRow row in dataGridView1.Rows)

Program zachowuje się jak najbardziej poprawnie.
Jeśli już chcesz wykonać metodę z Form1 to wystarczy napisać:

Form1.StatusChangeTo_In();

Druga uwaga to kolekcja wybranych wierszy jest we właściwości DataGridView1.SelectedRows i nie musisz "jeździć" po wszystkich wierszach żeby znaleźć te wybrane.
W Twoim kodzie znajdują się też inne błędy ale nie będę się do nich odnosił.

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