私は今朝ずっと頭をぶつけてきたので、うまくいけば助けを得ることができます。基本的に、.net4で動的に作成している一部のテキストボックスコントロールから値を取得する際に問題が発生します。
これがアプリケーションの望ましいフローです。
1)。ユーザーは、レターのテンプレートであるドロップダウンメニューからhtmlドキュメントを選択します。このhtmlドキュメントには、正しい値に置き換えられる$VARIABLENAME$形式のタグが含まれています。
2)。プログラムはテンプレートを介して実行され、$ STRING $形式のすべての文字列を引き出して、リストに格納します。
3)。このリストのエントリごとに、プログラムは元の$ VARIABLENAME $フィールドに基づいて一意のIDを持つasp:labelとasp:textboxを生成します。
4)。ユーザーが置換値を入力し、送信を押します。
5)。プログラムはすべての$STRING$を置換値に置き換え、結果を出力します。
テキストボックスから値を取得する必要がある時点まで、すべてがうまく機能します。ページのライフサイクルに問題があることは確かですが、使用者がドロップダウンから目的のテンプレートを選択するまでテキストボックスが生成されないため、ポストバックを通じてテキストボックスを保持して参照できるようにする方法がわかりません。
私はこれについてすべて間違っていますか?送信ボタンイベントからのポストバックが発生した後、ドロップダウンイベントから作成されたテキストフィールドにアクセスするにはどうすればよいですか?
編集:これが関連するコードのほとんどです。
protected void createTextBoxes(List<string> results)
{
if (results != null)
{
foreach (string result in results)
{
string formattedResult = result.Substring(1, result.Length - 2);
formattedResult = formattedResult.ToLower();
formattedResult = char.ToUpper(formattedResult[0]) + formattedResult.Substring(1);
var label = new Label();
label.ID = formattedResult;
label.Text = formattedResult + ": ";
templateFormPlaceholder.Controls.Add(label);
var textBox = new TextBox();
textBox.ID = result;
templateFormPlaceholder.Controls.Add(textBox);
templateFormPlaceholder.Controls.Add(new LiteralControl("<br />"));
previewBtn.Visible = true;
}
}
}
protected void templateDD_SelectedIndexChanged(object sender, EventArgs e)
{
var templatePath = "";
if (templateDD.SelectedIndex == 0)
{
previewBtn.Visible = false;
}
if (templateDD.SelectedIndex == 1)
{
templatePath = employeePath;
}
else if (templateDD.SelectedIndex == 2)
{
templatePath = managerPath;
}
List<string> regMatches = FindMatches(templatePath);
Session["regMatches"] = regMatches;
createTextBoxes(regMatches);
}
protected void Page_Init(object sender, EventArgs e)
{
if (Session["regMatches"] != null)
{
createTextBoxes((List<string>)Session["regMatches"]);
}
}
後で、これらのテキストボックスの値を辞書に追加しようとしています。パラメータは辞書の名前です。キーフィールドは$STRING$で、結果はユーザーがテキストボックスに入力したものです。
protected void previewBtn_Click(object sender, EventArgs e)
{
List<string> matchResults = (List<string>)Session["regMatches"];
Dictionary<string, string> parameters = new Dictionary<string, string>();
foreach (string result in matchResults)
{
TextBox tb = (TextBox)templateFormPlaceholder.FindControl(result);
parameters.Add(result, tb.Text);
}
var template = ReplaceKeys(parameters);
outputLBL.Text = template;
これが.aspxコードです。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="offerLetter.aspx.cs" Inherits="templateRegexTesting.offerLetter" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
Which template would you like to use?
</p>
<asp:DropDownList ID="templateDD" runat="server" OnSelectedIndexChanged="templateDD_SelectedIndexChanged"
AutoPostBack="true">
<asp:ListItem></asp:ListItem>
<asp:ListItem Value="1">Employee</asp:ListItem>
<asp:ListItem Value="2">Manager</asp:ListItem>
</asp:DropDownList>
<br />
<asp:PlaceHolder ID="templateFormPlaceholder" runat="server" />
<div>
<asp:Button ID="previewBtn" runat="server" Text="Preview" Visible="false" OnClick="previewBtn_Click" />
</div>
<div>
<asp:Label ID="outputLBL" runat="server"></asp:Label>
</div>
<br />
</div>
</form>
</body>
</html>
編集:私はそれを理解したときにこれをコメントに入れましたが、それをより見やすくするために質問に移動する必要があると考えました:
これを更新する必要があると思いました。私は少し馬鹿のように感じますが、私はこれをうまく機能させることができました。基本的に、私はコントロールに置換トークンと等しいIDを割り当てていました(たとえば、ID = "$ FIRSTNAME $")。$が問題を引き起こすことさえ私には気づかなかった。ID = "Firstname"の形式に変更したところ、完全に機能します。助けてくれてありがとう!