-1

runat="server" の div があります。div はパネルに含まれており、div 内にはいくつかのコントロールがあります。次のように、「ClearControlsInPanel()」メソッドを実行すると、div の外側 (パネル内) のすべてのコントロールがクリアされます。

public static void ClearControlsInPanel(Panel paneltoclear, string[] ignorelist)
{
    foreach (Control c1 in paneltoclear.Controls)
    {
        if (c1 is TextBox)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((TextBox)c1).Text = "";
            }
        }
        if (c1 is DropDownList)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((DropDownList)c1).SelectedIndex = 0;
            }
        }
        //etc.
    }
}

div に到達すると、そこにコントロールが表示されないため、それらのコントロールはクリアされません。皮肉なことに、まったく同じことについて投稿した人を見つけました。なぜ runat=server を div タグに追加すると、コントロール コレクションで 'System.Web.HttpException 型の例外がスローされるのですか? しかし、本当の解決策や説明がないまま、スレッドは終了します。

完全な例外は次のとおりです。

base {System.Web.UI.HtmlControls.HtmlContainerControl} = {InnerText = 
'((System.Web.UI.HtmlControls.HtmlContainerControl)
(((System.Web.UI.HtmlControls.HtmlGenericControl)(paneltoclear.Controls._controls
[165])))).InnerText' threw an exception of type 'System.Web.HttpException'}

これは runat サーバー div のままである必要があり、パネルに変更できないと想定してください。(パネルに変更することで解決することはほぼ確実ですが、これを runat サーバー div にする必要がある他の要件があります (長い話))。

4

2 に答える 2

1

パネルはとにかく div にレンダリングされるのに、なぜ div なのですか? 私はそれを必要とせず、この問題をかなり迅速に解決します:)

于 2012-03-28T04:09:53.497 に答える
0

divにアクセスする実際のコードを投稿すると簡単です。つまり、if ステートメントのどのブランチが実際にジェネリック コントロール ケースを処理するかということです。問題は、divのinnertextプロパティを設定しようとしていることにあると思います(例外が示唆するように)。トリックは、div コントロールに子がある場合、innertext プロパティが存在せず、すべてのテキストが div コントロールのコントロール配列でリテラルとして表されるということでしょうか?

したがって、子コレクションをクリアするには、次のようなものを試してください...

    public static void ClearControlsInPanel(ControlCollection controls, string[] ignorelist)
    {
        foreach (Control c1 in controls)
        {
            if (c1 is TextBox)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((TextBox)c1).Text = "";
                }
            }
            else if (c1 is DropDownList)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((DropDownList)c1).SelectedIndex = 0;
                }
            }
            else
            {
                if (c1.HasControls())
                {
                    ClearControlsInPanel(c1.Controls, ignorelist);
                }
            }
        }
    }
于 2012-03-28T07:38:22.907 に答える