0

numericUpDown を使用してコントロールを追加するコードに問題があります (たとえば、numericUpDown の値が 3 の場合、ユーザーは 3 つのテキスト ボックスを受け取ります)。

stackoverflow ユーザーのおかげで、コードが改善されました。

改善前はこんな感じ。

private void button1_Click(object sender, EventArgs e)

{

if (numericUpDown1.Value == 1)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);
}
else if (numericUpDown1.Value == 2)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);

    txtbx2.AutoSize = true;
    Controls.Add(txtbx2);
    txtbx2.Location = new Point(70, 130);
}
else if (numericUpDown1.Value == 3)
{
    txtbx1.AutoSize = true;
    Controls.Add(txtbx1);
    txtbx1.Location = new Point(70, 100);

    txtbx2.AutoSize = true;
    Controls.Add(txtbx2);
    txtbx2.Location = new Point(70, 130);

    txtx3.AutoSize = true;
    Controls.Add(txtbx3);
    txtbx3.Location = new Point(70, 160);
}

}

改善後:

private void button1_Click(object sender, EventArgs e)

{

int y = 100;
int x = 70;
for (int i = 0; i < numericUpDown1.Value; i++)
{
    var txtbx = new TextBox();
    txtbx.AutoSize = true;
    Controls.Add(txtbx);
    txtbx.Location = new Point(x, y);

    // Increase the y-position for next textbox.
    y += 30;
}

}

問題は、生成されたテキストボックスに名前を割り当てる方法がわからないことです。(改善前は名前を付けることができました - txtbx1、txtbx2、txtbx3...)

改善するコード:

private void button3_Click(object sender, EventArgs e)
{

    try
    {
        double a, b, c, sum;

        a = double.Parse(txtbx1.Text);
        b = double.Parse(txtbx2.Text);
        c = double.Parse(txtbx3.Text);

        sum = a + b + c;
        label1.Text = sum.ToString();



    }

    catch (Exception ex)
        {
            MessageBox.Show("error");
        }

私は初心者であり、YouTube のチュートリアルを見て C# を学んでいることに注意してください ;) 私の質問はばかげているかもしれませんが、この問題を自分で処理できませんでした。

お時間を割いていただき、ありがとうございます。

4

2 に答える 2

0

コメントで述べたように、このコードは私には高度すぎるようです。

コントロールの追加に問題はありませんが、ボタンのクリックからテキストボックスへの合計を取得する方法にはまだ問題があります。

おそらくいくつかの単純な間違いを犯したか、何かが不足していますが、この問題を修正する方法が本当にわかりません.

私のコード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace testprogram
{
public partial class Form1 : Form
{


    public Form1()
    {
        InitializeComponent();
    }



    private void button1_Click(object sender, EventArgs e) // I'm guessing something is missing over here

    {
        int sum = Controls.Cast<Control>().Sum(c => c.Name.StartsWith("ntextBox") ? int.Parse(c.Text) : 0);


    }
    void HandleNTextBoxInput(object sender, EventArgs e)
    {
        string text = ((TextBox)sender).Text;
        if (!Regex.IsMatch(text, "^[1-9][0-9]*$")) //Text is NOT numeric. Remove [1-9] if you want to keep leading zeros.
        {
            //Set the Text to 0, for example. Or show a message box. Or whatever.
            ((TextBox)sender).Text = "0";
        }
    }
    private int _oldNUDvalue = 0; //or assign it to the default value
    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        {
            int delta = (int)numericUpDown1.Value - _oldNUDvalue;
            if (delta < 0)
            {
                for (int i = -delta; i > 0; i--)
                {
                    var tbox = Controls.Find("ntextBox" + (_oldNUDvalue - i), false)[0];
                    Controls.Remove(tbox);
                }
            }
            else if (delta > 0)
            {
                for (int i = _oldNUDvalue; i < _oldNUDvalue + delta; i++)
                {
                    var tbox = new TextBox();
                    tbox.Location = new Point(15, 55 + (30 * i));
                    tbox.Name = "ntextBox" + i;
                    tbox.TextChanged += HandleNTextBoxInput;
                    Controls.Add(tbox);
                }
            }
            _oldNUDvalue = (int)numericUpDown1.Value;
        }


    }
}

}

于 2013-08-05T12:44:08.703 に答える
0

後でそれらにアクセスする必要がある場合は、いくつかのオプションがあります。あなたの目的は、label1 のテキストを、指定された textbox(es) に含まれる値の合計に設定することだと思います。

ValueChangedイベントで、デルタNumericUpDownを確認し、必要な数のを に追加または削除します。deltaを取得するには、 の以前の値を保存してから、現在の値から減算する必要があります。(5 だった場合は 4 になり、4 - 5 = -1。テキスト ボックスが削除されました)。TextBoxesFormControlsNumericUpDown

    private int _oldNUDvalue = 0; //or assign it to the default value
    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        int delta = (int)numericUpDown1.Value - _oldNUDvalue;
        if (delta < 0)
        {
            for (int i = -delta; i > 0; i--)
            {
                var tbox = Controls.Find("ntextBox" + (_oldNUDvalue - i), false)[0];
                Controls.Remove(tbox);
            }
        }
        else if (delta > 0)
        {
            for (int i = _oldNUDvalue; i < _oldNUDvalue + delta; i++)
            {
                var tbox = new TextBox();
                tbox.Location = new Point(15, 55 + (30 * i));
                tbox.Name = "ntextBox" + i;
                Controls.Add(tbox);
            }
        }
        _oldNUDvalue = (int)numericUpDown1.Value;
    }

ただし、最大数が 3 つしかない場合は、少し異なるアプローチを取ることができます。私のソリューションはn-textboxesで動作します。

最後に、TextBoxコードから es の値を取得するには、次の 3 つの方法があります。

フォームのコントロールをループし、"ntextBox" で始まる名前の TextBox を確認し、それらの値を一緒に追加します

LINQ を使用して同じことを行う

X はもちろん番号です。

LINQ のアプローチの方が気に入ったので、それを紹介します。

int sum = Controls.Cast<Control>().Sum(c => c.Name.StartsWith("ntextBox") ? int.Parse(c.Text) : 0);

コードをテストしていませんが、動作するはずです。何か問題があれば教えてください。

編集:テスト済みで動作します。完全を期すために、いくつかのイベント ロジックを TextBox 追加ループに追加して、それらの入力が実際に数値であることを確認します。

tbox.TextChanged += HandleNTextBoxInput; // add this line

他の場所では、次のメソッドを追加します。

void HandleNTextBoxInput(object sender, EventArgs e)
{
    string text = ((TextBox)sender).Text;
    if (!Regex.IsMatch(text, "^[1-9][0-9]*$")) //Text is NOT numeric. Remove [1-9] if you want to keep leading zeros.
    {
       //Set the Text to 0, for example. Or show a message box. Or whatever.
       ((TextBox)sender).Text = "0";
    }
}

ここに画像の説明を入力

于 2013-08-04T22:58:45.117 に答える