1

onload イベントでランタイムから生成された配列テキスト ボックスの値を取得できません。これがコードです。

フォームの onload イベントから:

private void frmMain_Load(object sender, EventArgs e)
{           
TextBox[] txtFldNames = new TextBox[15];
int x = 155, y = 65, w = 300, h = 20;

for (int i = 0; i < 15; i++)
{
    y = y + 30;
    txtFldNames[i] = new TextBox();
    txtFldNames[i].Location = new System.Drawing.Point(x, y);
    txtFldNames[i].Size = new System.Drawing.Size(w, h);
    this.Controls.Add(txtFldNames[i]);
    txtFldNames[i].ReadOnly = true;
    txtFldNames[i].BackColor = Color.White;
}
}

ボタンからテキストボックスの値にアクセスするにはどうすればよいですか?

private void button1_Click(object sender, EventArgs e)
{
     //what to do here?
}

私はすでにこれを以下で試しましたが、うまくいきません。私が得るのはnull値だけです。だから親切に私を正しい方向に向けてください

private void button1_Click(object sender, EventArgs e)
{
    TextBox[] txtFldNames = new TextBox[15];

    for (int j = 0; j < 15; j++)
    {
        txtFldNames[j] = new TextBox();
        MessageBox.Show("" + txtFldNames[j].Text);
    }
}

完全なコードは次のとおりです。

public partial class classMain : Form
{
    public frmMain()
    {
        InitializeComponent();
    }

    private void frmMain_Load(object sender, EventArgs e)
    {
        TextBox[] txtFldNames = new TextBox[15];
        int x = 155, y = 65, w = 300, h = 20;

        for (int i = 0; i < 15; i++)
        {
            y = y + 30;
            txtFldNames[i] = new TextBox();
            txtFldNames[i].Location = new System.Drawing.Point(x, y);
            txtFldNames[i].Size = new System.Drawing.Size(w, h);
            this.Controls.Add(txtFldNames[i]);
            txtFldNames[i].ReadOnly = true;
            txtFldNames[i].BackColor = Color.White;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //what to do here?
    }
}
4

4 に答える 4

1

新しいテキストボックスではなく、以前に作成したテキストボックスにアクセスする必要があります。

private void button1_Click(object sender, EventArgs e)
{
    for (int j = 0; j < 15; j++)
    {
        MessageBox.Show("" + txtFldNames[j].Text);
    }
}

ロードイベントでローカル変数だった場合txtFldNamesは、代わりにフォームのインスタンスフィールドになるように変更する必要があります。

于 2013-02-07T22:21:22.550 に答える
1

完全なコードがあれば、次の方法で何かを実行できます。

public partial class classMain : Form
{
    // Move your list to a global scope in the classMain form.
    TextBox[] txtFldNames = new TextBox[15];

    public frmMain()
    {
        InitializeComponent();
    }

    private void frmMain_Load(object sender, EventArgs e)
    {
        int x = 155, y = 65, w = 300, h = 20;

        for (int i = 0; i < 15; i++)
        {
            y = y + 30;
            txtFldNames[i] = new TextBox();
            txtFldNames[i].Location = new System.Drawing.Point(x, y);
            txtFldNames[i].Size = new System.Drawing.Size(w, h);
            this.Controls.Add(txtFldNames[i]);
            txtFldNames[i].ReadOnly = true;
            txtFldNames[i].BackColor = Color.White;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //what to do here?

        // Now you can access the global array variable.
        for (int i = 0; i < 15; i++)
        {
            MessageBox.Show(txtFldNames[i].Text);
        }
    }
}

そして、コードを少しクリーンアップしたい場合:

public partial class classMain : Form
{
    // Move your list to a global scope in the classMain form.
    TextBox[] txtFldNames = new TextBox[15];

    public frmMain()
    {
        InitializeComponent();
    }

    private void frmMain_Load(object sender, EventArgs e)
    {
        int x = 155, y = 65, w = 300, h = 20;

        for (int i = 0; i < 15; i++)
        {
            y = y + 30;

            var t = new TextBox
            {
                Location = new System.Drawing.Point(x, y),
                Size = new System.Drawing.Size(w, h),
                ReadOnly = true,
                BackColor = Color.White
            };

            txtFldNames[i] = t;
            this.Controls.Add(t);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //what to do here?

        // Now you can access the global array variable.
        for (int i = 0; i < txtFldNames.Length; i++)
        {
            MessageBox.Show(txtFldNames[i].Text);
        }
    }
}
于 2013-02-07T22:45:07.833 に答える
0

インスタンス変数であるコードサンプルから推測してtxtFldNamesいます(つまり、フォームのロードイベント内ではなく、フォームのスコープで宣言されています)。

したがって、ボタン クリック ハンドラーでは、txtFldNames配列の TextBox オブジェクト、つまりフォームが読み込まれたときに作成したオブジェクトを使用する必要があります。現在のコードは、代わりに TextBox オブジェクトの新しい配列を作成します。

例えば

foreach(TextBox textBox in tbFldNames) {
    MessageBox.Show(textBox.Text);
}

編集:

txtFldNames完全なコードの投稿に続いて、インスタンス変数を作成する必要があります。

すなわち

public partial class classMain : Form
{
    TextBox[] txtFldNames = new TextBox[15]; // <--- Move txtFldNames outside of your frmMain_Load() method.
于 2013-02-07T22:28:09.250 に答える
0

Enumerable.OfTypeTextBoxes を見つけるために使用できます。

foreach(TextBox txt in this.Controls.OfType<TextBox>())
{
    string text = txt.Text; 
}

(追加することを忘れないでくださいusing System.Linq;

を介して配列にアクセスすることもできますforeach(TextBox txt in txtFldNames)

new既存のものを参照するのではなく、ループ内で TextBoxes を作成しているため、このアプローチは機能しません。

于 2013-02-07T22:22:38.633 に答える