1

次の 3 つの主要な領域を持つ ASP.NET ページがあります。

1 - フィルタ結果の左側にあるチェックボックスのリスト

2 - 途中でマッチング結果を表示するリピーター(項目ごとにボタンあり)

3 - 選択したアイテムを右側に表示するリピーター

最初のページ読み込み時に、ページにはデータ バインドされたチェックボックスが表示され、すべての結果が表示されます (フィルターで何もチェックされていないため)。ユーザーがチェックボックスをオンまたはオフにすると、ページがリロードされ、一致する結果が変わります。これまでのところ、この部分はうまく機能しています。

リザルト リピーターでは、各アイテムにボタンがあります。ユーザーがリザルト内の項目のボタンをクリックすると、その項目が右側の選択されたリピーターに追加されるという考えです。何が起こっているのかというと、フィルターのチェックボックスをオンまたはオフにした後、初めて結果リピーターのボタンをクリックしようとしても何も起こりません。ページがリロードされるだけです。ボタンをもう一度クリックすると、Repeater コマンドが起動し、アイテムが右側の Repeater に追加されます。次に、チェックボックスを変更しない限り、コマンド ボタンの 1 つをクリックすると、すぐに機能します。しかし、フィルター領域のチェックボックスの 1 つをオンにした場合 (結果が再バインドされます)、ボタンの 1 つを 2 回クリックして起動させる必要があります。

これはViewStateと関係があると感じていますが、わかりません。なぜこれが起こるのか誰にも分かりますか?

以下は、ASPX ページとコード ビハインドの両方のコードです。

ASPX コード:

<h3>Filters</h3>
<asp:Repeater ID="rptTechnologies" runat="server" OnItemDataBound="rptFacet_ItemDataBound">
  <HeaderTemplate><h4>Technology</h4></HeaderTemplate>
  <ItemTemplate><asp:CheckBox ID="chkFacet" runat="server" AutoPostBack="true" OnCheckedChanged="chkFacet_Changed" /><br /></ItemTemplate>
</asp:Repeater>
<asp:Repeater ID="rptVerticals" runat="server" OnItemDataBound="rptFacet_ItemDataBound">
  <HeaderTemplate><h4>Vertical</h4></HeaderTemplate>
  <ItemTemplate><asp:CheckBox ID="chkFacet" runat="server" AutoPostBack="true" OnCheckedChanged="chkFacet_Changed" /><br /></ItemTemplate>
</asp:Repeater>
<asp:Repeater ID="rptIndustries" runat="server" OnItemDataBound="rptFacet_ItemDataBound">
  <HeaderTemplate><h4>Industry</h4></HeaderTemplate>
  <ItemTemplate><asp:CheckBox ID="chkFacet" runat="server" AutoPostBack="true" OnCheckedChanged="chkFacet_Changed" /><br /></ItemTemplate>
</asp:Repeater>
<asp:Repeater ID="rptSolutions" runat="server" OnItemDataBound="rptFacet_ItemDataBound">
  <HeaderTemplate><h4>Solution</h4></HeaderTemplate>
  <ItemTemplate><asp:CheckBox ID="chkFacet" runat="server" AutoPostBack="true" OnCheckedChanged="chkFacet_Changed" /><br /></ItemTemplate>
</asp:Repeater>

<h3>Results</h3>
<asp:Repeater ID="rptMatchingSlides" runat="server" OnItemDataBound="rptMatchingSlides_ItemDataBound" OnItemCommand="rptMatchingSlides_Command">
  <ItemTemplate>
    <h4><asp:Literal ID="litName" runat="server"></asp:Literal></h4>
    <asp:Button ID="btnSelect" runat="server" Text="Select" CommandName="Select" />
  </ItemTemplate>
  <SeparatorTemplate><hr /></SeparatorTemplate>
</asp:Repeater>

<h3>Selected</h3>
<asp:Repeater ID="rptSelectedSlides" runat="server" OnItemDataBound="rptSelectedSlides_ItemDataBound">
  <ItemTemplate>
    <h4><asp:Literal ID="litName" runat="server"></asp:Literal></h4>
  </ItemTemplate>
  <SeparatorTemplate><hr /></SeparatorTemplate>
</asp:Repeater>

コードビハインドは次のとおりです。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.BindData();
        }
    }

    public List<string> SelectedSlides
    {
        get 
        {
            if (Session["SelectedIDs"] != null)
            {
                string[] _ids = Session["SelectedIDs"].ToString().Split(new char[] { '|' });
                List<String> _retVal = new List<string>();
                foreach (string _id in _ids)
                {
                    _retVal.Add(_id);
                }
                return _retVal;
            }
            else 
            {
                return new List<string>();
            }
        }
        set 
        {
            //Set the session value
            string _val = "";
            foreach (string _id in value)
            {
                if (_val == "")
                {
                    _val = _id;
                }
                else 
                {
                    _val += "|" + _id;
                }
            }
            Session["SelectedIDs"] = _val;
        }
    }


    protected void BindData()
    {
        //Filters
        rptTechnologies.DataSource = Repository.GetTaxonomyItems();
        rptTechnologies.DataBind();

        rptVerticals.DataSource = Repository.GetTaxonomyItems();
        rptVerticals.DataBind();

        rptIndustries.DataSource = Repository.GetTaxonomyItems();
        rptIndustries.DataBind();

        rptSolutions.DataSource = Repository.GetTaxonomyItems();
        rptSolutions.DataBind();

        this.BindMatchingSlides();
    }

    protected void BindMatchingSlides()
    {
    ...build list of ids from checkboxes...

        rptMatchingSlides.DataSource = Repository.GetMatchingSlides(_selectedIDs);
        rptMatchingSlides.DataBind();
    }

    protected void BindSelectedSlides()
    {
        if (this.SelectedSlides.Count > 0)
        {
            rptSelectedSlides.DataSource = this.SelectedSlides;
            rptSelectedSlides.DataBind();
        }
        else 
        {
            divSelectedSlides.Visible = false;
        }
    }

    protected void rptMatchingSlides_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Literal _litName = (Literal)e.Item.FindControl("litName");
            Button _btnSelect = (Button)e.Item.FindControl("btnSelect");

            _litName.Text = ...set name here...

            _btnSelect.CommandArgument = ...use unique ID of item from database...
            _btnSelect.ID = "btnSelect_" + e.Item.ItemIndex;
        }
    }

    protected void rptMatchingSlides_Command(object sender, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Select")
        {
            Item _slide = ...get data from database based on Command Argument...
            if (_slide != null)
            {
                List<string> _selectedSlides = this.SelectedSlides;
                _selectedSlides.Add(_slide.ID.ToString());
                this.SelectedSlides = _selectedSlides;
            }
            this.BindSelectedSlides();
        }
    }
4

1 に答える 1

1

Jeremy のおかげで、ID を設定していたコード行を削除すると修正されました。どっ!別の場所で、リピーターのボタンの ID に一意の値を設定する必要があると読んだことがあります。だからそれが犯人だったに違いない。ジェレミーに感謝します。

于 2012-05-17T14:11:13.697 に答える