良い一日!私はこれを理解するためにかなりの時間を費やしました、そして今私はいくつかの助けが必要です。
TabContainer
4つの子を持つ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;
}
ありがとう!