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

問題は次のとおりです。ユーザーがクリックしたリピーター内のボタンの前色を変更する必要があります。最初はすべてのボタン (リピーターの項目) は灰色です。誰かがクリックされたら、その前色を赤 (パンくずのように) に変更する必要があります。

でアイテムを見つけてitemDataBounduniqueIdを比較しようとしましたが、機能しません。クリックして前景色を変更する特定のアイテムを見つける方法がわかりません:

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

リピーターのボタンの 1 つがクリックされたら、次のように処理します。

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 に答える