【问题标题】:asp.net Repeater Button does not fire event on first page load but after postback it doesasp.net 中继器按钮不会在第一页加载时触发事件,但在回发后它会触发
【发布时间】:2013-12-17 10:53:34
【问题描述】:

中继器中的按钮有一个奇怪的问题

网站加载后(Dotnetnuke 设置页面),中继器已完全创建,除了中继器中的按钮外,一切正常。他们什么都不做,我在代码的非常一行设置了一个断点,以确保它不做任何事情。

在另一个按钮(运行 CreateButton)执行回发(重新绑定转发器)后,它们按预期工作。

这是我的代码:

<asp:Repeater ID="rptForm" runat="server" EnableViewState="true" ItemType="ButtonObject" >
<%--OnItemCommand="rpt_ItemCommand"  OnItemDataBound="Repeater_ItemDataBound"--%>
    <HeaderTemplate>
        <table class="ButtonTable">
            <tr class="ButtonTableHeader">
                <td>Id</td>
                <td>Name</td>
                <td>Link</td>
                <td></td>
                <td></td>
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <%# Item.Id %>
            </td>
            <td>
                <%# Item.Name %>
            </td>
            <td>
                <%# Item.Link %>
            </td>

            <td>
                <asp:Button ID="EditBtn" runat="server" Text="Editieren"
                data-ButtonId="<%# Item.Id %>"
                CssClass="uk-button uk-button-primary"
                OnClick="EditButton"/>
                <%--CommandName="edit" CommandArgument="<%# Item.Id %>" --%>
            </td>
            <td>
                <asp:Button ID="DeleteBtn" runat="server" Text="Button Löschen"
                 data-ButtonId="<%# Item.Id %>"
                 CssClass="uk-button uk-button-primary"
                 OnClick="DeleteButton"/>
                <%--CommandName="delete"  CommandArgument="<%# Item.Id %>"--%>
            </td>

        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

下面是代码:

private static ButtonSettings BtnSettings = new ButtonSettings();

    protected void Page_Init(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BtnSettings = new ButtonSettings();
            if (Settings.Contains("ButtonSettings"))
            {
                BtnSettings.BuildButtonSettings(Settings["ButtonSettings"].ToString());
            }
            BindRepeater();
        }
    }

private void BindRepeater()
    {
        this.rptForm.DataSource = BtnSettings.Buttons;
        this.rptForm.DataBind();
    }

    protected void rpt_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
        //This Method will not be executed first time when site loads
        if (e.CommandName == "edit") // add this
        {
            EditButtonDiv.Visible = true;
        }
    }

    protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item)
        {
            Button button = (Button)e.Item.FindControl("DeleteBtn");
            if (button != null)
            {
                button.Click += DeleteButton;
            }
        }
    }

    protected void DeleteButton(Object sender, EventArgs e)
    {
        //This Method will not be executed first time when site loads
        Button button = sender as Button;
        var buttonID = Convert.ToInt32(button.Attributes["data-ButtonId"].ToString());

        BtnSettings.RemoveButton(buttonID);
        BindRepeater();
    }

    protected void EditButton(Object sender, EventArgs e)
    {

        //This Method will not be executed first time when site loads
       /* TODO:: Get ButtonId -  Set values */
        EditButtonDiv.Visible = true;
    }

    protected void CreateButton(Object sender, EventArgs e)
    {
        var buttonObj = new ButtonObject();
        ...
        BindRepeater();

        ScriptManager.RegisterStartupScript(Page, this.GetType(),
                    "script", "ReRegisterDivEvents()", true);
        ScriptManager.RegisterStartupScript(Page, this.GetType(),
                    "script", "ClearForm()", true);
    }

我哪里做错了?

【问题讨论】:

    标签: c# asp.net postback dotnetnuke


    【解决方案1】:

    中继器中的按钮与放置在其他软件中的按钮的工作方式不同。您需要使用 CommandName 和 CommandAttributes 字段来标识您的按钮和记录。然后,您使用转发器的 ItemCommand 事件对特定记录的特定按钮做出反应。

    这是一个很好的例子:http://www.developer.com/net/asp/article.php/3609466/ASPNET-Tip-Responding-to-the-Repeater-Controls-ItemCommand-Event.htm

    【讨论】:

      【解决方案2】:

      好吧,我的头晕了……

      我终于找到了为什么它不起作用的解决方案,谢谢https://siderite.dev/blog/dopostback-works-webformdopostbackwitho.html

      解决方案 我在这个网站上有一个验证器,如下所示:

      <asp:RequiredFieldValidator 
      ControlToValidate="name" 
      ForeColor="Red"
      ErrorMessage="Button Name is requierd" 
      runat="server">*</asp:RequiredFieldValidator>
      

      这确实阻止了按钮事件,因为输入为空。

      【讨论】:

        猜你喜欢
        • 2021-02-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多