在Repeater中查找和更改特定项目

时间:2013-02-05 18:18:39

标签: c# asp.net repeater

我有以下<asp:Repeater>

<asp:Repeater ID="repMenuParent" runat="server" DataSourceID="odsMenuParent" OnItemCommand="repMenuParent_OnItemCommand" OnItemDataBound="repMenuParent_OnItemDataBound" >
                <ItemTemplate>                        
                    <asp:Button id="btnRepeaterParent" runat="server" SkinID="btnAgroquimicos" CssClass="celdasMenusDinamicas" Text='<%# Eval("NOMBRE") %>' CommandName='<%# Eval("NOMBRE") %>' />
                 </ItemTemplate>
            </asp:Repeater>

当触发commandEvent时,我使用commandName和uniqueId:

建立会话
protected void repMenuParent_OnItemCommand(object source, RepeaterCommandEventArgs e)
{
    Session.Add("nombreSubMenuAgro", e.CommandName);

    String id = e.Item.UniqueID;
    Session.Add("souceId", id);        
}

问题如下:我需要更改用户使用的转发器内的按钮的前景色。在beginnig中,所有按钮(转发器中的项目)都是灰色的。当有人被点击时,我需要将它的前景颜色改为红色(就像面包屑一样)。

我试图找到itemDataBound中的项目并比较uniqueId但它不起作用,我不知道如何找到点击的特定项目来改变forecolor:

protected void repMenuParent_OnItemDataBound(object Sender, RepeaterItemEventArgs e)
{        
    String sessionID = "";
    Button btnRepeater;

    if ((e.Item.ItemType == ListItemType.Item) ||  (e.Item.ItemType == ListItemType.AlternatingItem))
    {
        btnRepeater = (Button)e.Item.FindControl("btnRepeaterParent");

        if (btnRepeater != null)
        {                
            if(btnRepeater.UniqueID.Equals(sessionID))
            {
                btnRepeater.ForeColor = System.Drawing.Color.FromArgb(69, 187, 32);
            }
        }
     }            
}

我已经阅读了很多博客关于转发器的帖子并找到它的项目,但找不到任何解决了我的问题,可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

我认为这个问题最好通过Javascript解决,尽管我确实有一个服务器端解决方案。

命令事件对象有一个名为CommandSource的属性。这使您可以访问触发命令事件的按钮。

protected void repMenuParent_OnItemCommand(object source, RepeaterCommandEventArgs e)
{
    Button btnRepeater=e.CommandSource;
    btnRepeater.ForeColor = Drawing.Color.Red;
}

答案 1 :(得分:0)

如果您维护按下按钮的ID列表,则可以执行以下操作:

首先,更改转发器中的按钮以使用CommandArgument 而非 CommandName。像这样:

<asp:Button id="btnRepeaterParent" ... CommandArgument='<%# Eval("NOMBRE") %>' />

创建用于访问ID列表的页面级属性。像这样:

public List<string> ClickedIds
{
   get
   {
      if(Session("ClickedIds") == null)
         Session("ClickedIds") = new List<string>();

      return (List<string>)Session("ClickedIds");
   }
}

单击转发器中的某个按钮时,请按照以下方式处理:

protected void repMenuParent_OnItemCommand(object source, RepeaterCommandEventArgs e)
{
    this.ClickedIds.Add(e.CommandArgument);       
}

现在,当您在代码隐藏中绑定转发器时,请检查每个按钮,如下所示:

protected void repMenuParent_OnItemDataBound(object Sender, RepeaterItemEventArgs e)
{        

   if ((e.Item.ItemType == ListItemType.Item) ||  (e.Item.ItemType == ListItemType.AlternatingItem))
   {
      //retrieve the id of the data item
      //I am not sure of your data item structure, but it will be something to this effect
      int nombre = e.Item.DataItem("NOMBRE");

      if(this.ClickedIds.Contains(nombre))
      {
         ((Button)e.Item.FindControl("btnRepeaterParent")).ForeColor = System.Drawing.Color.FromArgb(69, 187, 32);
      }
   }            
}

<强>声明: 我还没有测试过这段代码。