0

ユーザー入力用の 27 の DropDownLists を含むテーブルがあります。私のテーブルには、次の HTML が 27 回出現しています。

<span id="s1" runat="server"><asp:PlaceHolder ID="p1" runat="server"></asp:PlaceHolder></span>

ここで、スパンには s1、s2、...、s27 のインデックスが付けられ、PlaceHolder には p1、p2、...、p27 のインデックスが付けられます。スパンにインデックスが付けられている理由は、DropDownList を選択したものに置き換えることができるようにするためです。つまり、DropDownList は消えます。

DropDownLists を生成する方法は次のとおりです。

protected void Page_Load(object sender, EventArgs e)
{
    var data = CreateDataSource();
    int x;
    for (x = 1; x <= 27; x++)
    {
        DropDownList dl = new DropDownList();
        string index = x.ToString();
        dl.ID = "TrendList" + index;
        dl.AutoPostBack = true;
        dl.SelectedIndexChanged += new EventHandler(this.Selection_Change);
        dl.DataSource = data;
        dl.DataTextField = "TrendTextField";
        dl.DataValueField = "TrendValueField";
        dl.DataBind();
        if (!IsPostBack)
        {
            dl.SelectedIndex = 0;
        }
        PlaceHolder ph = (PlaceHolder)form1.FindControl("p" + index);
        ph.Controls.Add(dl);
    }
}

最後の行で実行時エラーが発生します。任意の DropDownList を選択して選択できますが、2 つ目の DropDownList を選択して選択すると、次のエラーが発生します。

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Line 46:             }
Line 47:             PlaceHolder ph = (PlaceHolder)form1.FindControl("p" + index);
Line 48:             ph.Controls.Add(dl);
Line 49:         }

これは、力ずくで行っていたときに機能しているように見えました。

p1.Controls.Add(DropList1);
p2.Controls.Add(DropList2);
etc....

しかし、今はエラーが発生しています。これをデバッガーで実行しましたが、null 参照が見つかりません。

アドバイスをいただければ幸いです。

よろしく。

4

4 に答える 4

0

問題は、この関数がすべての新しいページで呼び出されたことであることが判明しました。最初の実行後、最初のプレースホルダーが存在しなくなり、null 参照エラーがスローされたことを意味します。この問題は、次のコードで解決されました。

if (placeHolder != null)
{
    placeHolder.Controls.Add(ddl);
}
于 2012-07-02T02:19:00.067 に答える
0

プレースホルダーは技術的にはフォーム 1 ではなく、フォーム 1 のスパンにあります (または、スパンは他のコントロールなどにあります)。

これは、スパンが form1 でネストされている状況で機能します。

var s = form1.FindControl("s" + index);
var ph = s.FindControl("p" + index);
ph.Controls.Add(dl);
于 2012-06-11T21:33:35.237 に答える
0

メソッドは再帰的ではないため、FindControlネストされたオブジェクトを反復処理する方法を使用する必要があります。SO で見つかった良い例を次に示します 。C#、FindControl

于 2012-06-11T21:34:49.393 に答える
0

プレースホルダーを 1 つだけ使用してみましたか? エラーメッセージは、"p" + index.ToString() の ID によるプレースホルダーがないことについてのようです。

于 2012-06-11T21:25:44.757 に答える