-1

我正在为朋友制作一个应用程序,需要用户“输入”一个值,并将其返回给我拥有的 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.
    }
}

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

4

2 回答 2

1

正如您的评论和其他人所提到的,堆栈溢出来自您DBApplication实例化 a Form1,而后者又实例化 a DBApplication,后者又实例化 a Form1,依此类推。

重写你DBApplication的 aForm1作为其构造函数的一部分,而不是实例化它自己的,这将避免无限递归,并且可能这是你想要的,因为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实例化 a 的位置Form1,而Form1将现有的DBApplication传入。

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

于 2013-05-15T21:32:49.030 回答
0

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

于 2013-05-15T21:26:41.347 回答