再会!我花了好几个小时试图弄清楚这一点,现在我需要一些帮助。
我有一个 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;
}
谢谢!