System.StackOverflowException по формам - PullRequest
0 голосов
/ 28 апреля 2010

Я пытаюсь открыть другую форму с помощью кнопки, и это только нормально в начале. После нескольких форм сделал ошибку стека переполнения! Ошибка в форме 1, форме 2 и форме 3 (я начал отлаживать несколько раз): коды действительно просты. как для формы 3:

public partial class Form2 : Form
{
    Form3 obrok = new Form3();
    public Form2()
    {
        InitializeComponent();
    }

    public void textBox1_TextChanged(object sender, EventArgs e)
    {
    }

    private void button1_Click(object sender, EventArgs e)
    {
        obrok.Show();
        this.Hide();
    }
}

( добавлено из комментария, особенно для сохранения отступов кода (MI) )

Вышеуказанная ошибка решена (с помощью оператора). Теперь проблема в том, что я не хочу сохранять значения из текстового поля в базе данных доступа. Код: Form1 users = new Form1 (); private void button1_Click (отправитель объекта, EventArgs e) { string conString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Источник данных = C: \ Users \ Simon \ Desktop \ save.mdb";

        OleDbConnection empConnection = new OleDbConnection(conString);


        string insertStatement = "INSERT INTO obroki_save "
                             + "([ID_uporabnika],[datum],[ID_zivila],[skupaj_kalorij]) "
                             + "VALUES (@ID_uporabnika,@datum,@ID_zivila,@skupaj_kalorij)";

        OleDbCommand insertCommand = new OleDbCommand(insertStatement, empConnection);

        insertCommand.Parameters.Add("@ID_uporabnika", OleDbType.Char).Value = users.iDTextBox.Text;
        insertCommand.Parameters.Add("@datum", OleDbType.Char).Value = DateTime.Now;
        insertCommand.Parameters.Add("@ID_zivila", OleDbType.Char).Value = iDTextBox.Text;
        insertCommand.Parameters.Add("@skupaj_kalorij", OleDbType.Char).Value = textBox1.Text;
        empConnection.Open();

        try
        {
            int count = insertCommand.ExecuteNonQuery();
        }
        catch (OleDbException ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            empConnection.Close();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
            textBox5.Clear();
        }
    }
}

Когда я не хочу передавать значения, это показывает, что в типе данных в условном выражении есть ошибка.

1 Ответ

2 голосов
/ 28 апреля 2010

Итак, Form2 создает новую форму Form3 при ее создании, Form3 создает новую форму Form5 при создании ... может быть, Form5 даже создает еще одну форму, которая создает другую и так далее? По моему мнению, вы объявили свои классы таким образом, что создание экземпляров одного из них фактически приводит к созданию множества других объектов формы, и, возможно, существует даже циклическая ссылка (например, Form3 => Form5 => Form ??? => ... => Form3 => Form5 => Form ??? => ... навсегда), так что вы застряли в бесконечной рекурсии в конструкторах ваших форм.

Если все так, если возможно для вашей программной логики, вы должны переместить ваши объявления форм внутри метода, который их показывает, лучше, если они заключены в оператор using: таким образом они получают экземпляры только тогда, когда они необходимы и уничтожаются именно тогда, когда они больше не используются.

...