0

再会!我花了好几个小时试图弄清楚这一点,现在我需要一些帮助。

我有一个 ASP.NET AjaxToolKit TabContainer,它有四个TabPanel孩子。这些孩子中的每一个都有自己的UpdatePanel,因此我可以在每个面板中运行逻辑而无需重新加载所有内容(AJAX)。

这是我的问题:

在我的 SECONDTabPanel中,我有一些看起来像这样的标记:

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

在我的Page_Init例程中,我动态地将行/单元格/标签/texboxes 添加到控件中。

当我在 SECONDTabPanel中进行回发时,FIRST 中的任何回发现在都会TabPanel导致从服务器返回 500 错误。如果我从未在 SECOND 中进行回发,则第一次回发运行良好。即使我没有在为表动态创建的控件中放置任何值(即,我没有在其中放置任何无效字符来触发页面验证)也是如此。

如果我删除文本框的动态创建,它可以工作,但我很难理解为什么,因为它们是空白的,并且我确保所有控件 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

事实证明,我超出了单个回发中允许的控件数量。

你可以在这里读到它:

ASP.NET MS11-100:如何更改发布表单值的最大数量限制?

我使用这个 web.config 设置来增加它:

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

我是否应该使用那么多控件是一个完全不同的问题。:)

我通过删除页面上的其他内容来解决这个问题。当我这样做时,它又开始工作了。

这几乎把我逼到了精神错乱的边缘。万岁!

于 2013-02-06T23:58:30.340 回答