0

我有以下内容<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);        
}

问题如下:我需要更改用户点击的中继器内按钮的前景色。在开始时,所有按钮(中继器中的项目)都是灰色的。单击某人时,我需要将其前景色更改为红色(如面包屑)。

我试图在 中找到该项目itemDataBound并比较 uniqueId 但它不起作用,我不知道如何找到单击以更改前景色的特定项目:

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);
            }
        }
     }            
}

我已经阅读了许多关于中继器的博客主题并找到了它的项目,但找不到任何解决我的问题的东西,可以帮助我吗?

4

2 回答 2

2

我认为这个问题最好用 Javascript 解决,尽管我确实为你提供了服务器端解决方案。

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

protected void repMenuParent_OnItemCommand(object source, RepeaterCommandEventArgs e)
{
    Button btnRepeater=e.CommandSource;
    btnRepeater.ForeColor = Drawing.Color.Red;
}
于 2013-02-05T18:46:37.067 回答
0

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

首先,将中继器中的按钮更改为使用CommandArgument not 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);
      }
   }            
}

免责声明: 我没有测试过这段代码。

于 2013-02-05T21:12:47.753 回答