0

良い一日!私はこれを理解するためにかなりの時間を費やしました、そして今私はいくつかの助けが必要です。

TabContainer4つの子を持つASP.NETAjaxToolKitがありますTabPanel。これらの子にはそれぞれ独自のものがUpdatePanelあるため、すべてをリロードせずに各パネルでロジックを実行できます(AJAX)。

これが私の問題です:

私の2番目TabPanelには、次のようなマークアップがあります。

<div id="ProgramMilestonesDiv" style="margin-left: 6px;">
    <asp:Table ID="ProgramMilestonesTable" runat="server" Visible="true">
    </asp:Table>
</div>

私のPage_Initルーチンでは、行/セル/ラベル/texboxをコントロールに動的に追加します。

SECONDTabPanelでポストバックを実行すると、FIRSTでポストバックがTabPanel発生すると、サーバーから500エラーが返されるようになりました。SECONDでポストバックを実行しない場合、FIRSTポストバックは正常に実行されます。これは、動的に作成されたテーブルのコントロールに値を入れていない場合でも同じです(つまり、ページ検証をトリップするために無効な文字を入れていません)。

テキストボックスの動的作成を削除すると機能しますが、空白であり、すべてのコントロールIDが一意であることを確認したため、理由がわかりません。同じコードビハインドメソッドを使用して、ページ上に動的に作成された他のテキストボックスもたくさんあり、それらは正常に機能します(これらはAccordionコントロールのテーブルにあります)。

何がうまくいかないかについての提案はありますか?それが失敗している特定の理由を確認するためにそれをデバッグすることに関する提案はありますか?

テキストボックスを作成するための私のコードビハインドは次のようになります。

 public static void AddVariableCostRowToTable(Table TargetTable, string CostArea, string CostType, Extender Extender)
    {
        string[] quarters = { "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12" };

        TableRow row = new TableRow(); // New row we'll add to table.

        // First cell is just the name of the cost.
        TableCell cell = new TableCell();
        Label label = new Label();
        label.Width = new Unit(175);
        label.Text = CostType.Replace('_', ' ') + ":";
        cell.Controls.Add(label);
        row.Controls.Add(cell);

        // Create all the textboxes for the individual quarters.
        foreach (string q in quarters)
        {
            row.Controls.Add(CreateNewCellWithTextBox(CostArea, CostType, q, Extender));
        }

        TargetTable.Controls.Add(row); // Add the row to the table.
    }

 public static TableCell CreateNewCellWithTextBox(string CostArea, string CostType, string Quarter, Extender Extender)
    {
        TableCell cell = new TableCell();
        TextBox textbox = new TextBox();

        textbox.ID = CostArea + CostType + Quarter; // string
        textbox.Width = new Unit(65); // Pixels wide.
        textbox.Text = "";
        if (Extender == Extender.MASKED_EDIT_EXTENDER) textbox.Text = "0"; // Only initialize to 0 if textbox is for money.
        textbox.Style.Add(HtmlTextWriterStyle.TextAlign, "right");
        textbox.ClientIDMode = ClientIDMode.Static;

        cell.Controls.Add(textbox);

        if (Extender == Extender.MASKED_EDIT_EXTENDER) // If calling routine wanted a $$$ filter on the textbox.
        {
            // Add an ajaxtoolkit extender so we can enforce currency formatting.
            MaskedEditExtender extender = new MaskedEditExtender();
            extender.ID = "MaskedEditExtender" + textbox.ID;
            extender.TargetControlID = textbox.ID;
            extender.Mask = "999999";
            extender.OnFocusCssClass = "MaskedEditFocus";
            extender.MaskType = MaskedEditType.Number;
            extender.InputDirection = MaskedEditInputDirection.RightToLeft;
            extender.AcceptNegative = MaskedEditShowSymbol.Left;
            extender.DisplayMoney = MaskedEditShowSymbol.Left;

            cell.Controls.Add(extender);
        }

        return cell;
    }

ありがとう!

4

1 に答える 1

1

結局のところ、私は1回のポストバックで許可されているコントロールの数を超えていました。

あなたはここでそれについて読むことができます:

ASP.NET MS11-100:投稿されたフォーム値の最大数の制限を変更するにはどうすればよいですか?

私はそれを増やすためにこのweb.config設定を使用しました:

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2000" />
</appSettings>

その多くのコントロールを使用する必要があるかどうかは、まったく別の問題です。:)

私は自分のページの他のコンテンツを削除することでこれを理解しました。私がやったとき、それは再び働き始めました。

これはほとんど私を狂気の瀬戸際に追いやった。やったー!

于 2013-02-06T23:58:30.340 に答える