1

バインド後にリピーターの特定のラベルを表示しようとしています。リピーターのすべてのアイテムのすべてのラベルを表示したくありません。ボタンをクリックしたところだけです。更新ボタンをクリックすると、DB 内のトーナメント アイテムの情報が更新されます。変更が成功したことを示すラベルを表示したいのですが、更新したアイテムに対してのみです。

これがコードビハインドです。[...] は、DB で更新を行う場所です

protected void repeatTourney_ItemCommand(object source, RepeaterCommandEventArgs e)  
           {  
               if (e.CommandName == "btnUpdate_Click")  
               {  
                   [...]
                   Label lblSuccess= (Label)e.Item.FindControl("lblUpdateSuccess");
                    bindRepeater(ddlEvents.Text);
                    lblSuccess.Visible = true;
               }
           }

こちらがaspxです。[...] は、DB アイテムの情報を含むテキストボックスやその他のものです。

<asp:Repeater ID="repeatTourney" runat="server" OnItemDataBound="repeatTourney_ItemDataBound"
                    OnItemCommand="repeatTourney_ItemCommand">
    <ItemTemplate>
        <div class="form">
           [...]
            <asp:Label ID="lblUpdateSuccess" runat="server" Text="Update success" Visible="false" />
            <asp:Button ID="btnUpdate" runat="server" Text="Update" CssClass="button" CommandName="btnUpdate_Click" />
            [...]
        </div>
     </ItemTemplate>
 </asp:Repeater>

最終的にはこのようになるはずです

Item
 Info
 BtnUpdate
 lblSuccess.Visible = false

Item
 Info
 BtnUpdate <== Clicked
 lblSuccess.Visible = true

ご協力ありがとうございました。

編集:これが私のbindRepeaterコードです

 private void bindRepeater(string name)
        {
            List<Tourney> list = TourneyDAL.GetByNameEvent(name);
            [...]
            repeatTournois.DataSource = list;
            repeatTournois.DataBind();
            [...]
        }

編集 2: バインディング後にどの ID を表示する必要があるかを示す ID のアイデアをありがとう。

うまくいきました。:)

ここに私の新しいコード

private void bindRepeater(string name, int index)
    {
        List<Tourney> list = TourneyDAL.GetByNameEvent(name);
        [...]
        repeatTourney.DataSource = list;
        repeatTourney.DataBind();
        [...]
        if (index != 0)
        {
            Label lblReussie = (Label)repeatTourney.Items[index].FindControl("lblUpdateSuccess");
            lblSuccess.Visible = true;
        }

protected void repeatTourney_ItemCommand(object source, RepeaterCommandEventArgs e)  
       {  
           if (e.CommandName == "btnUpdate_Click")  
           {  
               [...]
               Label lblSuccess= (Label)e.Item.FindControl("lblUpdateSuccess");
                bindRepeater(ddlEvenements.Text, e.Item.ItemIndex);
                lblSuccess.Visible = true;
           }
       }
    }
4

1 に答える 1

2

何が問題なのか言っていませんが、例外はありますか?

ItemDataBound可視性を設定するために使用できます。ただし、そのため、最後に更新したインデックス/ID をフィールドなどに保存する必要があります。

protected void repeatTourney_ItemCommand(object source, RepeaterCommandEventArgs e)  
{  
    if (e.CommandName == "btnUpdate_Click")  
    {  
        updatedID = int.Parse(e.CommandArgument.ToString());
        bindRepeater(ddlEvents.Text);
    }
}


private int? updatedID = null;

protected void repeatTourney_ItemDataBound(Object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var tourney = (Tourney) e.Item.DataItem;
        Label lblUpdateSuccess = (Label)e.Item.FindControl("lblUpdateSuccess");
        lblUpdateSuccess.Visible = updatedID.HasValue && tourney.Id == updatedID.Value;
    }
}
于 2013-02-18T15:18:52.287 に答える