Domanda

Ecco cosa sto facendo. Creo due pulsanti in una riga di intestazione di una griglia che ho creato. I pulsanti sono + page e -page. Quando viene premuto -page rimuovo il paging e tutti i dati scendono dalla pagina e -page scompare e + page è lì.

Ecco il mio problema Quando premo + pagina devo essere il doppio postback perché una riga dei miei dati scompare. Fornirò il codice qui sotto. Cosa posso fare per risolvere questo ??

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')")

--------------------- Come vengono aggiunti i pulsanti ------------------ ------------------------

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

A cura

<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>

Come puoi vedere, quando l'uno o l'altro viene colpito imposto una casella di testo su un valore, quindi eseguo un postback parziale sul mio Gridview che si trova in quel Pannello di aggiornamento.

È stato utile?

Soluzione

Ho trovato una bella soluzione che funziona alla grande. Aggiunge il proprio gestore, ma immagino che possa essere risolto anche.

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

Altri suggerimenti

Sospetto sia perché hai chiamato il " __ doPostBack " metodo. Il normale comportamento di clic predefinito dei pulsanti eseguirà il postback di Async, probabilmente l'hai fatto eseguire un'altra volta. Prova a rimuoverlo e guarda come va.

Puoi provare a mettere l'attributo Click sui pulsanti nella dichiarazione dell'evento RowDataBound ??

Saluti.

Prova a cambiare < asp: ImageButtons > essere normale HTML < img > tag.

Mi sono imbattuto in questo genere di cose prima delle quali era difficile diagnosticare e ancora più difficile da spiegare. Vedi qui e qui per alcuni comportamenti errati che potrebbero essere d'aiuto. Se hai & Lt; img & Gt; i tag con attributi src vuoti, quindi i collegamenti ipertestuali che ho fornito probabilmente spiegano il problema. Se non hai spazi vuoti & Lt; img & Gt; tag quindi continua a leggere per il mio lavoro in giro.

Nel mio caso specifico, stava accadendo solo su alcuni server (in alcuni siti client) ma non in altri, quindi non sono riuscito a trovare problemi concreti con il codice. La mia soluzione era quella di cambiare il mio & Lt; asp: ImageButtons & Gt; al normale < img > tag con eventi click javascript che chiamerebbero una funzione per eseguire il postback, proprio come la tua funzione Paging ().

Per qualche motivo, ho scoperto che un < asp: ImageButton > con un evento onclick lato client di ritorno: conferma ('ne sei sicuro?'); interromperà un postback se il comando confirm () restituisce false, tuttavia restituendo false nel modo in cui si esegue la funzione Paging () dopo aver chiamato manualmente un __doPostBack non si interrompe in modo coerente il ritorno della pagina una seconda volta.

Guarda l'html come viene visualizzato nella pagina:

Ogni volta che è presente

<img src=""/>

può accadere un doppio postback, per alcuni browser ...

Questo problema potrebbe essere risolto impostando un'immagine predefinita, vuota, per ogni pulsante

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

In ogni caso, questo comando può essere inserito in Immediate Window se si inserisce un punto di interruzione all'interno di Page_Load e si consente di identificare il controllo che ha causato il postback

Page.Request.Params["__EVENTTARGET"];

Prova questo, (non so perché stavi usando javascript):

bttnrempag.onclick += bttnrempag_Click; 

protected void bttnrempag_Click(object sender, EventArgs e)
{
    //handle the removal of paging or whatever.
}

Devi fornire un'immagine per i tuoi ImageButtons. In caso contrario, il rendering dell'HTML produrrà un tag <img src=""> e, quando viene eseguito il rendering, causerà un postback. Provalo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top