none
LinkButton не подхватывает обработчик события OnClick и OnCommand RRS feed

  • Общие обсуждения

  • Добрый день, ситуация такая: есть до безобразия простой репитер напичканный LinkButton'ами и обычными кнопками для теста. Набор параметров абсолютно идентичен:

            <asp:Repeater ID="MainPathCatalogRepeater" runat="server" OnItemCommand="RepeaterCatalogMenu_ItemCommand" >
                <HeaderTemplate>
                    <div class="panel panel-default">
    					<div class="panel-heading">Каталог</div>
    					<div class="panel-body">
                            <ul class="nav nav-pills nav-stacked col-md-4" style="width: 100%">
                </HeaderTemplate>
                <ItemTemplate>
        				<li  class="<%# GetItemSelectionStyle(DataBinder.Eval(Container.DataItem,"SiteDirectoriesID").ToString() )%>" >
                            <%--<a href="#"><%# Eval("SiteDirectoriesNodeText")%></a>--%>
                            <asp:LinkButton ID="TestLinkButton1" runat="server" OnClick="LinkButton1_Click" OnCommand="LinkButton1_Command"  CommandArgument='<%# Eval("SiteDirectoriesID") %>' Text='<%# DataBinder.Eval(Container.DataItem,"SiteDirectoriesNodeText")%>' />
                            <asp:Button ID="Button1" runat="server" OnClick="LinkButton1_Click" OnCommand="LinkButton1_Command"  CommandArgument='<%# Eval("SiteDirectoriesID") %>' Text='<%# DataBinder.Eval(Container.DataItem,"SiteDirectoriesNodeText")%>' />
    
        				</li>
    
                    
                </ItemTemplate>
    
                <FooterTemplate>
                            </ul>
    					</div>
    	    		</div>
                </div>
                </FooterTemplate>
            </asp:Repeater>  

    К репитеру идут два метода:

        protected void LinkButton1_Command(object sender, CommandEventArgs e)
        {
            string commandArgument = e.CommandArgument.ToString();
    
            int IdFromCommand = Base.StringToInt(commandArgument);
    
            this.SelectedItemID = IdFromCommand;
            Session["SelectedItemID"] = this.SelectedItemID.ToString();
    
            if (OnItemClick != null)
            {
                OnItemClick(this, new EventArgs());
            }
        }
    
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            int a = 5;
            Session["SelectedItemID"] = this.SelectedItemID.ToString();
        }

    Проблема в следующем: при клике на Button идет вызов обработчиков и команды и онклик. При нажатии на LinkButton нет ни одного вызова. Что я делаю не так, подскажите пожалуйста?

    24 ноября 2014 г. 23:28

Все ответы

  • Для того, чтобы ваш код заработал вам нужно каждому контролу назначить команды. Для этого можно воспользоваться событием ItemCreated репитера, по id найти нужный вам контрол и назанчить ему созданный обработчик события

    [Блог] [Twitter]

    25 ноября 2014 г. 10:39
  • Сделал

        public void SetEventClick(object Item)
        {
            if (Item is RepeaterItem)
            {
                var FindedControl = (Item as RepeaterItem).FindControl("LinkButton1");
                if(FindedControl!=null)
                {
                    (FindedControl as LinkButton).Click -= LinkButton1_Click;
                    (FindedControl as LinkButton).Click += LinkButton1_Click;
                }
    
    
            }
        }
    
        protected void MainPathCatalogRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            SetEventClick(e.Item);
        }


    И соответственно прописал в репитер

       <asp:Repeater ID="MainPathCatalogRepeater" runat="server" OnItemCreated="MainPathCatalogRepeater_ItemCreated" OnItemCommand="MainPathCatalogRepeater_ItemCommand" >

    Уже пробовал впихнуть MainPathCatalogRepeater_ItemCommand.

    Ничего не вышло! Как не цеплял онклик так и не цепляет. Меняю для теста на ListBox, ставлю автопостбэк и читаю параметр при изменении индекса - Все работает, а с репитером только баттон, но он не подходит.

    :( 

    25 ноября 2014 г. 19:45
  • Убедитесь, что вы не делаете повторную привязку (DataBind) при обратной отправке (PostBack), это тоже может служить причиной.

    Сделаем содержимое сообщества лучше, вместе!

    7 декабря 2014 г. 8:57
    Модератор
  • попробуй сделать так...

    <asp:Repeater ID="MainPathCatalogRepeater" runat="server" OnItemCommand="RepeaterCatalogMenu_ItemCommand" >
    
    ...
    <ItemTemplate>
    
    <asp:LinkButton ID="TestLinkButton1" runat="server" CommandName="LinkButton1_Command"  CommandArgument='<%# Eval("SiteDirectoriesID") %>' Text='<%# DataBinder.Eval(Container.DataItem,"SiteDirectoriesNodeText")%>' />
    
    </ItemTemplate>
    ...
        protected void RepeaterCatalogMenu_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
                   if (e.CommandArgument.ToString() == "") return;
            string arg = e.CommandArgument.ToString(); // переданный аргумент
            switch (e.CommandName)
            {
                case "LinkButton1_Command":
                    // тут делаешь что надо
                    break;
            }
        }



    10 декабря 2014 г. 21:52
  • А если так

      <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand" DataSourceID="SqlDataSource1">
                <ItemTemplate>
     <asp:LinkButton runat="server" CommandArgument="1" CommandName="up">LinkButton</asp:LinkButton>
                </ItemTemplate>
               
            </asp:Repeater>

     protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (String.Equals("up", e.CommandName.ToString()))
            {
                var w = e.CommandArgument;
                Response.Write(w);
            }
        }

    15 декабря 2014 г. 18:28
  • А чем ваш пример принципиально отличается от того, что я предложил выше?
    16 декабря 2014 г. 14:16