我正在为朋友制作一个应用程序,并且需要用户“输入”一个值,然后将其返回给我的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命令可以接收它,并输出一个新值。
答案 0 :(得分:1)
正如你的评论和其他人所提到的,堆栈溢出来自DBApplication
实例化Form1
,DBApplication
反过来实例化Form1
,DBApplication
反过来实例化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()
(它是一个实例变量)。如何解决问题取决于您的应用程序逻辑。