1

私は2つのフォーム(Form1、form2)を持っていますform2のこのコード... form1のすべてのコントロールのループを作成し、コントロールの名前(ControlName)を取得しますこのコントロールにテキスト(例: "sherif")を送信します(ケースボタン)

 foreach (Control ctrl in form1.Controls)
{
    form1.Controls[ControlName]).Text = "sherif";
}

エラーメッセージが表示されますNullReferenceExceptionオブジェクト参照がオブジェクトのインスタンスに設定されていません。ポインタが[ControlName]の上で停止した場合、コントロールの名前を読み取りますが、続行するとNull値になります

4

4 に答える 4

2

Textフォーム内のすべてのコントロールのプロパティを変更したいだけの場合は、次のようにする必要があります。

foreach (Control ctrl in form1.Controls)
{
   ctrl.Text = "sherif";
}

これはトップレベルのコントロールのみを変更し、ネストされたコントロールは変更しないことに注意してください。

ネストされたコントロールにもこれが必要な場合は、再帰的に実行します。

 public void RecursiveChange(Control control)       
 {

    foreach (Control ctrl in control.Controls)
    {
       RecursiveChange(ctrl);
       ctrl.Text = "sherif";
    }
 }
于 2013-02-05T12:50:28.040 に答える
1

このメソッドは、フォームのすべてのコントロールを再帰的に返します。

public IEnumerable<Control> GetChildControls(Control parent)
{
    foreach(Control ctrl in parent.Controls)
    {
        yield return ctrl;

        if (ctrl.HasChildren)
            yield return GetChildControls(ctrl);
    }
}

テキストの更新:

foreach(var ctrl in GetChildControls(form1))
    ctrl.Text = "sherif";
于 2013-02-05T12:54:59.473 に答える
0

すべてのコントロールをループする必要があります。それらのいくつかは、パネルの内側に置くことができます。この再帰的な方法を使用します。

private void SetText(Control control, string text)       
{
     foreach (Control ctrl in control.Controls)
     {
         ctrl.Text = text;
         SetText(ctrl, text);
     }
}

使用法:

SetText(form1,  "sherif");
于 2013-02-05T12:51:15.007 に答える
-1

これを試して

foreach (Control c in form1.Controls)
{

    if (c!= null)
    {
        c.text="Sherif";
    }
}
于 2013-02-05T12:50:49.770 に答える