代码之家  ›  专栏  ›  技术社区  ›  Eric

停止双回发

  •  3
  • Eric  · 技术社区  · 15 年前

    这是我正在做的。我在创建的网格视图的标题行中创建了两个按钮。按钮是+页和-页。当点击-page时,我会删除分页,所有数据都会进入页面,然后-page消失,而+page就在那里。

    我的问题来了 当我点击+page时,我必须进行双重回发,因为我的一行数据会消失。我将提供下面的代码。我能做些什么来解决这个问题??

    Dim bttnrempag As New Button
        bttnrempag.ID = "bttnrempag"
        bttnrempag.Text = "      Paging"
        bttnrempag.CssClass = "bttnMinEG"
        bttnrempag.ValidationGroup = "alone"
        bttnrempag.Attributes.Add("onclick", "return Paging('1')")
    
        Dim bttnallowpag As New Button
        bttnallowpag.ID = "bttnallowpag"
        bttnallowpag.Text = "      Paging"
        bttnallowpag.ValidationGroup = "alone"
        bttnallowpag.CssClass = "bttnAddEG"
        bttnallowpag.Attributes.Add("onclick", "return Paging('0')")
    

    ----------------如何添加按钮----------------------------------

        Dim row As New GridViewRow(-1, -1, DataControlRowType.Separator, DataControlRowState.Normal)
        row.Cells.Add(cell)
        cell.Controls.Add(bttnrempag) '36
        cell.Controls.Add(bttnallowpag)
    

    ————————————————————————————————————————————————————————————————————————————————————————————————————————————————---

    function Paging(remove) {
        var gridView = $get('<%=Gridview1.ClientID %>');
        var txt2 = $get('<%=TextBox2.ClientID %>');
        if (remove == '1') {
            txt2.value = '1';
            __doPostBack('<%=UpdatePanel1.ClientID %>', '');
            return false;
        }
        else {
            txt2.value = '0';
            __doPostBack('<%=UpdatePanel1.ClientID %>', '');
            return false;
        }
    

    编辑

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate >
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
                AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF" 
                BorderStyle="None" BorderWidth="1px" CellPadding="3" 
                DataSourceID="SqlDataSource1" Font-Names="Comic Sans MS" Font-Size="XX-Small"
                Caption = '<table border="" width="100%" cellpadding="3" cellspacing="0" bgcolor="#4A3C8C"><tr><td style = "font-size:X-large;font-family:Arial CE;color:White"><b>Ordering/Receiving Log</u></td></tr></table>' 
                Font-Bold="True" PageSize="15" >
                <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
    
                <Columns>
                          Bound Data
                </Columns>
                <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
                <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
                <EmptyDataTemplate>
                <head>
                    <meta http-equiv="refresh" content="5;URL=/Corporate_newpo/ReceivingLog.aspx?">
                </head>
                    <script type="text/javascript" >
                        var count = 6;
                        var counter = setInterval("timer()", 1000); //1000 will  run it every 1 second
    
                        function timer() {
                            count = count - 1;
                            if (count <= 0) {
                                clearInterval(counter);
                                //counter ended, do something here
                                return;
                            }
                            $get("timer").innerHTML = "The Table will Reload in " + count + " secs";
                        }
                    </script>
                    <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="Large" 
                        ForeColor="#993333" Text="No Data was Found for the Selected Filter"></asp:Label><br /><br />
                   <span id="timer" style="font-size:medium;color:blue"></span>
                </EmptyDataTemplate>
                <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
                <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
                <AlternatingRowStyle BackColor="#F7F7F7" />
                <PagerTemplate>
                    <small 12px""="" style="font-size:xx-small; padding-right">Go To Page</small>
                    <asp:DropDownList ID="ddlPageSelector" runat="server" AutoPostBack="true" 
                        Font-Size="XX-Small" Height="19px" Width="36px">
                    </asp:DropDownList>
                    <asp:ImageButton ID="btnFirst" runat="server" CommandArgument="First" 
                        CommandName="Page" SkinID="pagefirst" />
                    <asp:ImageButton ID="btnPrevious" runat="server" CommandArgument="Prev" 
                        CommandName="Page" SkinID="pageprev" />
                    <asp:ImageButton ID="btnNext" runat="server" CommandArgument="Next" 
                        CommandName="Page" SkinID="pagenext" />
                    <asp:ImageButton ID="btnLast" runat="server" CommandArgument="Last" 
                        CommandName="Page" SkinID="pagelast" />
                </PagerTemplate>
                </asp:GridView>
            </ContentTemplate> 
        </asp:UpdatePanel>
    

    所以你可以看到,当一个或另一个被点击时,我设置了一个文本框为某个值,然后我做了一个部分回发到我的网格视图,它在那个更新面板中。

    7 回复  |  直到 12 年前
        1
  •  0
  •   Zaibot    14 年前

    我找到了一个很好的解决方案,效果很好。它确实附加了自己的处理程序,但我想这也可以修复。

    using System.Linq;
    
    private void GridView_OnItemDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var buttons = e.Row.Cells.OfType<DataControlFieldCell>().SelectMany(item => item.Controls.OfType<ImageButton>());
            foreach (ImageButton imageButton in buttons)
            {
                var argument = imageButton.CommandName + "$" + imageButton.CommandArgument;
                imageButton.OnClientClick = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView, argument) + "; return false;";
            }
        }
    }
    
        2
  •  2
  •   o.k.w    15 年前

    我怀疑是因为你调用了“dopostback”方法。按钮的正常默认单击行为将执行异步回发,您可能让它再次执行。试着把它取下来看看会怎么样。

        3
  •  1
  •   Zinx    15 年前

    是否可以尝试将click属性放在rowdatabound事件声明中的按钮上??

    干杯。

        4
  •  1
  •   wweicker    15 年前

    尝试将您的<asp:ImageButtons>更改为常规的HTML<img>标记。

    我以前遇到过这种事情,很难诊断,更难解释。参见 here here 对于一些可能有帮助的马车行为。如果您有SRC属性为空的<img>标记,那么我提供的超链接可能会解释此问题。如果您没有任何空白的<img>标签,请继续阅读我的工作。

    在我的特定案例中,它只发生在某些服务器(在某些客户机站点)上,而不是其他服务器上,因此我找不到代码的任何具体问题。我的解决方法是将我的<asp:ImageButtons>更改为常规的<img>标记,并使用javascript单击事件调用函数来执行回发,这与您的paging()函数非常相似。

    出于某种原因,我发现了一个客户端onclick事件为return:confirm的<asp:ImageButton>('是否确定?');如果confirm()返回false,则将停止回发,但是在手动调用uuDoPostback后,以paging()函数中的方式返回false并不会始终阻止页面再次回发。

        5
  •  1
  •   Emanuele Greco    12 年前

    请查看页面上呈现的HTML:

    每次它出现

    <img src=""/>
    

    对于某些浏览器,可能会发生双重回发…

    这个问题可以通过为每个按钮设置默认的空白图像来解决。

    <asp:ImageButton ImageUrl="~/Images/blank.gif"...>
    

    无论如何,此命令可以输入到 Immediate Window 如果你在里面放一个断点 Page_Load 允许你 识别导致回发的控件

    Page.Request.Params["__EVENTTARGET"];
    
        6
  •  0
  •   Chris    15 年前

    试试这个(我不知道你为什么用javascript):

    bttnrempag.onclick += bttnrempag_Click; 
    
    protected void bttnrempag_Click(object sender, EventArgs e)
    {
        //handle the removal of paging or whatever.
    }
    
        7
  •  0
  •   Richard Anthony Hein    15 年前

    您必须为ImageButton提供图像。否则,呈现的HTML将生成 <img src=""> 标记,当呈现时,将导致回发。试试看。