Question

Voici ce que je fais. Je crée deux boutons dans une ligne d'en-tête d'un gridview que j'ai créé. Les boutons sont + page et -page. Lorsque vous frappez -page, je supprime la recherche de personnes et toutes les données disparaissent de la page. -Page disparaît et + page se trouve.

Voici mon problème Lorsque je clique sur + page, je dois effectuer une double postbacking car une ligne de mes données disparaît. Je vais fournir le code ci-dessous. Que puis-je faire pour résoudre ce problème?

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

--------------------- Comment les boutons sont ajoutés ------------------ ------------------------

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

Modifié

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

Comme vous pouvez le constater, lorsque l'un ou l'autre est touché, je mets une valeur dans une zone de texte, puis une publication partielle dans Gridview, qui se trouve dans cet Updatepanel.

Était-ce utile?

La solution

J'ai trouvé une bonne solution qui fonctionne très bien. Il ajoute son propre gestionnaire, mais je suppose que cela peut également être corrigé.

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

Autres conseils

Je suppose que c'est parce que vous avez appelé le & "; __ doPostBack &"; méthode. Le comportement de clic normal par défaut des boutons effectuera la publication Async, vous l'avez probablement obligé à effectuer une autre exécution. Essayez de l'enlever et voir comment ça se passe.

Pouvez-vous essayer de placer l'attribut de clic sur les boutons de la déclaration d'événement RowDataBound?

A bientôt.

Essayez de changer votre < asp: ImageButtons > être un HTML normal < img > Mots clés.

J'ai déjà rencontré ce genre de problème qui était difficile à diagnostiquer et encore plus difficile à expliquer. Voir ici et here pour un comportement buggy qui pourrait aider. Si vous avez & Lt; img & Gt; balises avec des attributs src vierges, les liens hypertexte que j’ai fournis expliquent probablement le problème. Si vous n'avez pas de blanc & Lt; img & Gt; balises puis continuez à lire pour mon travail autour.

Dans mon cas particulier, cela ne se produisait que sur certains serveurs (sur certains sites clients) mais pas sur d'autres, de sorte que je ne pouvais trouver aucun problème concret avec le code. Ma solution de contournement consistait à changer mon & Lt; asp: ImageButtons & Gt; to régulier < img > balises avec des événements de clic javascript qui appellent une fonction pour effectuer la publication, un peu comme votre fonction Paging ().

Pour une raison quelconque, j’ai trouvé qu’un < asp: ImageButton > en cas de retour du client lors d’un retour sur clic: confirmez ('êtes-vous sûr?'); arrêtera une publication si la fonction confirm () renvoie la valeur false, mais renvoyer la valeur false de la même manière que dans votre fonction Paging () après l'appel manuel d'un __doPostBack n'empêche pas systématiquement la page de publier une seconde fois.

Veuillez regarder le code HTML tel qu'il est rendu sur la page:

Chaque fois que c'est présent

<img src=""/>

double postback peut arriver, pour certains navigateurs ...

Ce problème pourrait être résolu en définissant une image vide par défaut pour chaque bouton

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

Quoi qu'il en soit, cette commande peut être entrée dans Immediate Window si vous placez un point d'arrêt à l'intérieur de Page_Load et vous autorisez à identifier le contrôle à l'origine de la publication

.
Page.Request.Params["__EVENTTARGET"];

Essayez ceci (je ne sais pas pourquoi vous utilisiez javascript):

bttnrempag.onclick += bttnrempag_Click; 

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

Vous devez fournir une image pour vos boutons ImageButtons. Sinon, le rendu HTML générera une balise <img src=""> qui, une fois rendue, générera une publication. Essayez-le.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top