-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.
    }
}

ユーザーが「Enter」を押した後、値を「DB_Application」に戻す必要があるため、MySQL コマンドは値を受け取り、新しい値を出力できます。

4

2 に答える 2

1

あなたのコメントや他の人が述べたように、スタック オーバーフローはDBApplicationインスタンス化された aForm1から発生DBApplicationしてForm1います。

独自のものをインスタンス化するのではなく、コンストラクターの一部としてDBApplicationa を取るように書き直します。これにより、無限再帰が回避され、オープン フォームが適切に参照されるため、これが必要になる可能性があります。Form1DBApplication

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場所を反転する必要があるかもしれません。DBApplicationForm1Form1DBApplication

一般に、これを行うより良い方法 (依存性注入など) がありますが、これは現在のアーキテクチャを完全に壊すことなく簡単な方法である必要があります。

于 2013-05-15T21:32:49.030 に答える
0

実際にnew Form1()DBApplication から呼び出すと、StackOverflow はnew DBApplication()Form1 から取得されます (これはインスタンス変数です)。問題を解決する方法は、アプリケーション ロジックによって異なります。

于 2013-05-15T21:26:41.347 に答える