StackOverFlow异常,需要绕过无限循环

时间:2013-05-15 21:18:36

标签: c# database stack-overflow

我正在为朋友制作一个应用程序,并且需要用户“输入”一个值,然后将其返回给我的MySQL代码。这样,显示会发生什么变化。

我的问题是这样的:当我做“Form1 newForm = new Form1();” (这在DB_Application中调用) 我收到了stackoverflow错误。

public partial class Form1
{
    private DBApplication DB_App = new DBApplication();
    private void InitializeComponent()
    {
        this.orderID.Text = "";
        this.orderID.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.EnterKey);
        .....
        this.phoneNumber.Text = DB_App.phone_number;
        .....
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

        private void EnterKey(object o, KeyPressEventArgs e)
    {
        if(e.KeyChar == (char)Keys.Enter)
        {
                //converts the "orderID.Text" to an integer value.
            if (!int.TryParse(orderID.Text, out newCurrentID))
                MessageBox.Show("not a number");

            e.Handled = true;
        }
    }
}

public class DBApplication : DBInfo
{
    Form1 newForm = new Form1();  // infinite loop
    public DBApplication()
    {
        OrderID();
    }
    private string OrderID ()
    {
     .... //reads the MySQL info, and outputs the value from the database.
    }
}

用户按下“enter”后,我需要将值返回到“DB_Application”,以便MySQL命令可以接收它,并输出一个新值。

2 个答案:

答案 0 :(得分:1)

正如你的评论和其他人所提到的,堆栈溢出来自DBApplication实例化Form1DBApplication反过来实例化Form1DBApplication反过来实例化Form1 1}}等等。

重写你的DBApplication以将public class DBApplication { private Form1 Form; public DBApplication(Form1 form) { this.Form = form; } ... } public partial class Form1 : Form { private DBApplication DB_App; public Form1() { DB_App = new DBApplication(this); InitializeComponent(); } ... } 作为其构造函数的一部分,而不是实例化它自己,这将避免无限递归,并且可能这是你想要的,因为DB_App将正确引用开放表格:

InitializeComponent()

根据您应用程序的其余部分,您可能希望在调用DB_App之后实例化InitializeComponent() (第二次查看您的代码很明显,在调用DBApplication之前,DBApplication需要分配。)

此外,由于我们不知道Form1的完整设计/用法,您可能需要在Form1实例化DBApplication和{{1}的地方翻转它而是传入了现有的{{1}}。

通常有更好的方法(比如通过依赖注入),但这应该是一种简单的方法,而不会完全破坏你现在的架构。

答案 1 :(得分:0)

如果您确实从DBApplication调用new Form1(),则StackOverflow来自Form1中的new DBApplication()(它是一个实例变量)。如何解决问题取决于您的应用程序逻辑。