0

ユーザーがボタンをクリックするたびに動的に作成したい単純なユーザーコントロールがあります(ボタンはデータをデータベースに保存します)。これは、ユーザーが返信し、メッセージの下に表示される一種のディスカッションフォーラムです。

ユーザーが [返信] ボタンをクリックすると、ModalPopupExtender ウィンドウがポップアップし、ユーザーはその返信を入力して送信します。

ポップアップデータで送信をクリックすると、データベースに保存されますが、OnInit は ButtonClick の前に実行されます。このシナリオで新しいコントロールを作成してコントロールに追加する方法。

ここに画像の説明を入力

ここに画像の説明を入力

制御コード ASPX

<div style="border: .25em solid #000; margin: 10px; padding: 10px">
    <div>
        <asp:Label ID="lblMessage" runat="server" Width="200px"></asp:Label>
    </div>
    <div>
        <asp:Button ID="btnReply" runat="server" Text="Reply" />
    </div>
</div>
<table>
    <tr>
        <td>
            <asp:ModalPopupExtender ID="mpeReply" runat="server" TargetControlID="btnReply" PopupControlID="pnlReply"
                BackgroundCssClass="ModalPopupBG1">
            </asp:ModalPopupExtender>
            <asp:Panel ID="pnlReply" runat="server">
                <div class="popupbody">
                    <table width="90%">
                        <tr>
                            <td>
                                <asp:TextBox ID="txtReply" runat="server" Width="400px" CssClass="input1" TextMode="MultiLine"
                                    ValidationGroup="ReplyPopup"></asp:TextBox>
                            </td>
                        </tr>
                        <tr>
                            <td colspan="2">
                                <asp:Button ID="btnSubmit" runat="server" Text="Submit" ValidationGroup="ReplyPopup"
                                    OnClick="btnSubmit_Click" />
                                <asp:Button ID="btnClose" runat="server" Text="Cancel" CausesValidation="false" />
                            </td>
                        </tr>
                    </table>
                </div>
            </asp:Panel>
        </td>
    </tr>
</table>

ユーザー コントロール .cs (ボタンをクリックしてメッセージを db に保存するだけ)

protected void btnSubmit_Click(object sender, EventArgs e)
{
    message.Save();
}

ページ .cs

protected void Page_Init(object sender, EventArgs e)
{
    LoadControl();
}

protected void Page_Load(object sender, EventArgs e)
{
}

private void LoadControl()
{
    divMessageControl.Controls.Clear();

    MessageCollection msgs = MessageCollection.LoadAll();
    foreach (Message msg in msgs)
    {
        AddControlInPlaceHolder(msg);
    }
}

private void AddControlInPlaceHolder(Message msg)
{
    Control myUserControl = (Control)Page.LoadControl("~/Controls/MessageControl.ascx");

    Label lblMessage = myUserControl.FindControl("lblMessage") as Label;
    if (lblMessage != null)
    {
        lblMessage.Text = msg.MsgTxt;
    }

    divMessageControl.Controls.Add(myUserControl);
}
4

2 に答える 2

1

動的に追加されたコントロールを操作する場合、以前に追加されたすべてのコントロールを Page_Init ハンドラーで再作成する必要があります。ただし、新しいコントロールの場合は、ポストバック コントロール イベント ハンドラーだけに追加しても問題ありません。クリック ハンドラAddControlInPlaceHolderでメソッドを呼び出してみてください。btnSubmitそのメソッドでデータベース メッセージの ID を取得する必要がある場合は、Save メソッドのメッセージ ID を新しい値で更新することを検討してください。

于 2012-11-05T20:19:43.643 に答える
1

page_load でコントロールを再作成する必要があります。完全な例:

public partial class _Default : Page
{
    public int n;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["Controls"] != null)
            n = (int)ViewState["Controls"];
        if (!Page.IsPostBack)
            n = 0;
        for (int i = 0; i <= n; i++)
        {
            TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
            uc.ID = "TestControl" + i.ToString();
            PlaceHolder1.Controls.Add(uc);
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl;
        uc.ID = "TestControl" + n++.ToString();
        PlaceHolder1.Controls.Add(uc);
        ViewState["Controls"] = n;
    }
}
于 2013-04-01T10:03:10.587 に答える