1

Webフォームを使用してからかなりの時間が経ちましたが、ほとんどの特典を覚えていません。

ボタンとリピーターを持つユーザーコントロールがあり、リピーターのItemTemplateプロパティは別のユーザーコントロールです。

<asp:Button runat="server" ID="btnAdd" CssClass="btn" Text="Add" OnClick="btnAdd_Click"/>
<br/>
<asp:Repeater runat="server" ID="rptrRequests">
    <ItemTemplate>
        <uc1:ucRequest ID="ucNewRequest" runat="server" />
    </ItemTemplate>
</asp:Repeater>

ユーザーが[追加]ボタンをクリックすると、ucRequestの新しいインスタンスがコレクションに追加されるという考え方です。背後にあるコードは次のとおりです。

public partial class ucRequests : UserControl
{
    public List<ucRequest> requests
    {
        get
        {
            return (from RepeaterItem item in rptrRequests.Items 
                    select (ucRequest) (item.Controls[1])
                    ).ToList();
        }
        set
        {
            rptrRequests.DataSource = value;
            rptrRequests.DataBind();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) return;

        requests = new List<ucRequest>();
    }

    protected void btnAdd_Click(object sender, EventArgs e)
    {
        var reqs = requests;
        reqs.Add(new ucRequest());
        requests = reqs;
    }
}

何度もグーグルした後、ViewStateがコントロールのキャプチャされたデータをポストバックの間にあるucRequestコントロール内に配置するために、OnInitメソッドでRepeaterをバインドする必要があることを思い出しましたが、そうしようとすると常にItemsコレクションは常に空であるため、Repeaterのコントロールの単一インスタンス。

どうすればこれを行うことができますか?

前もって感謝します。

4

2 に答える 2

2

コントロール コレクション全体ではなく、ビュー ステートのコントロール ID だけが必要です。

ここに画像の説明を入力

<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="ucRequests.ascx.cs"
    Inherits="RepeaterWebApplication.ucRequests" %>
<asp:Button runat="server" ID="btnAdd" CssClass="btn" Text="Add" 
   OnClick="btnAdd_Click" />
<br /><asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>

<%@ Control Language="C#" AutoEventWireup="true" 
   CodeBehind="ucRequest.ascx.cs" 
   Inherits="RepeaterWebApplication.ucRequest" %>
<asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>

private List<int> _controlIds;

private List<int> ControlIds
{
    get
    {
        if (_controlIds == null)
        {
            if (ViewState["ControlIds"] != null)
                _controlIds = (List<int>) ViewState["ControlIds"];
            else
                _controlIds = new List<int>();
        }
        return _controlIds;
    }
    set { ViewState["ControlIds"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (int id in ControlIds)
        {
            Control ctrl = Page.LoadControl("ucRequest.ascx");
            ctrl.ID = id.ToString();

            PlaceHolder1.Controls.Add(ctrl);
        }
    }
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    var reqs = ControlIds;
    int id = ControlIds.Count + 1;

    reqs.Add(id);
    ControlIds = reqs;

    Control ctrl = Page.LoadControl("ucRequest.ascx");
    ctrl.ID = id.ToString();

    PlaceHolder1.Controls.Add(ctrl);
}
于 2013-01-21T23:54:47.560 に答える
0

OnItemDatabound イベント中に ucRequests を取得してみてください。その時点で、リピーターの itemtemplate のコンテンツを編集できます。追加ボタンをクリックしてポストバックが発生した後、そこにアクセスできます。同様のシナリオのサンプルを次に示します

于 2013-01-21T22:03:30.363 に答える