0

テキストボックスにイライラする問題があります。1 つのテキスト ボックスにデータを入力し、ボタンをクリックして結果を別のテキスト ボックスに表示する必要があります。なぜ私の方法がうまくいかないのか、本当にわかりません。エラーは発生しませんが、結果は表示されません。ありがとう!すべてのテキスト ボックスは、実行時に動的に作成されます。コードは次のとおりです。

     private void button2_Click(object sender, EventArgs e)
    {
        TextBox tbox8 = new TextBox();
        tbox8.Name = "textBox8";
        tbox8.Location = new System.Drawing.Point(54 + (0), 55);
        tbox8.Size = new System.Drawing.Size(53, 20);
        this.Controls.Add(tbox8);
        tbox8.BackColor = System.Drawing.SystemColors.InactiveCaption;
        tbox8.TextChanged += new EventHandler(tbox8_TextChanged);

        TextBox tbox9 = new TextBox();
        tbox9.Name = "textBox9";
        tbox9.Location = new System.Drawing.Point(54 + (60), 55);
        tbox9.Size = new System.Drawing.Size(53, 20);
        this.Controls.Add(tbox9);
        tbox9.BackColor = System.Drawing.SystemColors.InactiveCaption;
        tbox9.TextChanged += new EventHandler(tbox9_TextChanged);

     }//button_click

    //input data into texbox8
    TextBox tbox;
    double var1;
    private void tbox8_TextChanged(object sender, EventArgs e)
    {
        tbox = sender as TextBox;
        var1 = Convert.ToDouble(tbox.Text);
    }

    //display the result in textbox9
    TextBox tbox2;
    private void tbox9_TextChanged(object sender, EventArgs e)
    {
        tbox2 = sender as TextBox;
    }

    //perform calculation and on button click display data on referenced textbox
    private void button3_Click(object sender, EventArgs e)
    {
        double result2 = var1 * 2;
        if( tbox2 != null)
        {
            tbox2.Text = result2.ToString(); 
        }      
    }
4

3 に答える 3

3

不要なビットをコメントアウトし、いくつかの新しい行を追加したコードを次に示します。

TextBox tbox8 = new TextBox(); //make it a member variable
TextBox tbox9 = new TextBox(); //same for this one

private void button2_Click(object sender, EventArgs e)
{
    tbox8.Name = "textBox8";
    tbox8.Location = new System.Drawing.Point(54 + (0), 55);
    tbox8.Size = new System.Drawing.Size(53, 20);
    this.Controls.Add(tbox8);
    tbox8.BackColor = System.Drawing.SystemColors.InactiveCaption;
    tbox8.TextChanged += new EventHandler(tbox8_TextChanged);

    tbox9.Name = "textBox9";
    tbox9.Location = new System.Drawing.Point(54 + (60), 55);
    tbox9.Size = new System.Drawing.Size(53, 20);
    this.Controls.Add(tbox9);
    tbox9.BackColor = System.Drawing.SystemColors.InactiveCaption;
    tbox9.TextChanged += new EventHandler(tbox9_TextChanged);

 }//button_click

//input data into texbox8
//TextBox tbox;
double var1;
private void tbox8_TextChanged(object sender, EventArgs e)
{
    //tbox = sender as TextBox;
    var1 = Convert.ToDouble(tbox8.Text);//tbox8
}

//display the result in textbox9
//TextBox tbox2;//tbox2 is actually tbox9 anyway
private void tbox9_TextChanged(object sender, EventArgs e)
{
//    tbox2 = sender as TextBox;//so we don't need a tbox2
    //do something
}

//perform calculation and on button click display data on referenced textbox
private void button3_Click(object sender, EventArgs e)
{
    double result2 = var1 * 2;
    //if( null != tbox9 ) 
    //{
        tbox9.Text = result2.ToString(); //changed to tbox9
    //}      
}

ただし、これにはまだ問題があります。ユーザーが button2 を複数回クリックするとどうなりますか?

于 2012-08-22T17:15:52.757 に答える
0

結果*2がdoubleの算術オーバーフローを引き起こさないと仮定すると、このようなものが機能するはずです。tbox8に入力された値をdoubleに解析できない場合、button3をクリックした後にtbox9に表示される結果は0になります。

TextBoxのイベントを使用していないので、それらのハンドラーを作成する必要はありません。また、ボタン2をクリックした後は無効にして、再度クリックできないようにします。

button2をもう一度クリックする必要がある場合は、別のボタンイベントハンドラーなどから有効にする必要があります。これにより、this.Controlsコレクションからtbox8とtbox9を削除して、有効にする前に(button2)、アプリケーションがそれらの追加のコピーを作成しようとしています。

private void button2_Click(object sender, EventArgs e) {
    button2.Enabled = false;
    TextBox tbox8 = new TextBox();
    tbox8.Name = "textBox8";
    tbox8.Location = new System.Drawing.Point(54 + (0), 55);
    tbox8.Size = new System.Drawing.Size(53, 20);
    this.Controls.Add(tbox8);
    tbox8.BackColor = System.Drawing.SystemColors.InactiveCaption;

    TextBox tbox9 = new TextBox();
    tbox9.Name = "textBox9";
    tbox9.Location = new System.Drawing.Point(54 + (60), 55);
    tbox9.Size = new System.Drawing.Size(53, 20);
    this.Controls.Add(tbox9);
    tbox9.BackColor = System.Drawing.SystemColors.InactiveCaption; }

private void button3_Click(object sender, EventArgs e) {
    double result = 0;
    double.TryParse(tbox8.Text, out result);
    tbox9.Text = (double)(result * 2).ToString(); }
于 2012-08-22T18:57:41.797 に答える
0

tbox8 (意味のある名前を使用してみてください) がテキストが入力されることになっているものであり、tbox14 が出力が期待される場所であると仮定すると、tbox14 の TextChanged イベントで tbox2 変数のみを設定するのはなぜですか? tbox14 の TextChanged イベントを実行しないため、tbox2 が常に null であるため、コードが機能していない可能性があります。とにかく、単に tbox14 を使用する代わりに、変数 tbox2 を使用しているのはなぜですか?

また、tbox8 の TextChanged イベントでテキストを解析するのは、おそらく間違った場所です。TextChanged イベントは、キーストロークごとに発生します。button3 の Click ハンドラで 1 回だけ実行してみませんか? または、フォーカスを失ったときに実行します。

これを試してみてください (注: これはまだくだらないコードではありません)。まず、すべての TextChanged イベントを取り除き、次に:

private void button3_Click(object sender, EventArgs e)
{
    var1 = Convert.ToDouble(tbox8.Text);
    double result2 = var1 * 2;
    tbox14.Text = result2.ToString();    
}
于 2012-08-22T17:16:16.953 に答える