5

私は今朝ずっと頭をぶつけてきたので、うまくいけば助けを得ることができます。基本的に、.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"の形式に変更したところ、完全に機能します。助けてくれてありがとう!

4

3 に答える 3

7

そうです、それはすべてページのライフサイクルに関するものです。動的に作成されたコントロールは、ビューステートバインディングステージのPage_Initに存在するために、ステージで再作成する必要があります。これは、それらを再作成するために、前の処理で作成した数を何らかの方法で(おそらくを使用して)保存する必要があることを意味します。同じIDを使用し、それらをコントロールツリー(リピーターまたは使用している他のもの)に追加することを忘れないでください。Sessiontextboxes


アップデート

提案をさせてください:1。タイプのクラス属性を宣言しますList<TextBox>(それを呼びましょうCreatedTextBoxes

  1. テキストボックスを作成するために必要なものをすべて受け取るメソッドを宣言します。このメソッドは、その範囲外のものを読み取ってはなりません。いくつかの引数を受け取り、テキストボックスを作成して、それらを別のコントロール(などRepeater)に追加するだけです。作成された各テキストボックスを追加しますCreatedTextBoxes

  2. ドロップダウン変更イベントで、オプションを読み取り、に保存して、Sessionこのメソッドを呼び出します

  3. Page_Init、でそのオブジェクトを確認しますSession。nullまたは空の場合は、何もしないでください。値がある場合は、同じメソッドを呼び出し、同じ引数を渡します

  4. 動的に作成されたテキストボックスからそれを取得する必要がある場合は、を使用CreatedTextBoxesし、FindControls()
于 2012-08-16T17:22:04.447 に答える
1

TextBoxコントロールを追加しますが、それらを見つけるためにtemplateFormPlaceholder.Controls使用form1.FindControlします。FindControlメソッドは、コントロールが指定されたコンテナーに直接含まれている場合にのみコントロールを検索します-http://msdn.microsoft.com/en-us/library/486wc64h.aspxから。templateFormPlaceholder.FindControl代わりに電話してみてください。

于 2012-08-16T18:53:51.063 に答える
1

動的テキストボックスを作成し、それをaspパネルに追加して、簡単にアクセスできるようにします。

これがASP.NETの設計要素です。

<div class="form-group">
<asp:Panel ID="panel" runat="server" CssClass="form-group">

</asp:Panel>
</div>

動的テキストボックスを生成するためのC#コード

 protected void create_dynamic_text(object sender, EventArgs e)
{
    int num = 5; // you can give the number here
    for (int i = 0; i < num;i++ )
    {
        TextBox tb = new TextBox();
        tb.ID = "txt_box_name" + i.ToString();
        tb.CssClass = "add classes if you need";
        tb.Width = 400; //Manage width and height 
        panel.Controls.Add(tb); //panel is my ASP.Panel object. Look above for the design code of ASP panel
    }
}

値を取るC#コード

 protected void reade_values(object sender, EventArgs e)
{
   int num=5; // your count goes here
    TextBox tb = new TextBox();
        for (int i = 0; i < num; i++)
        {
           tb=(TextBox)panel.FindControl("txt_box_name"+i.ToString());
           string value = tb.Text; //You have the data now
        }
    }
}
于 2015-11-17T06:09:27.323 に答える