web-dev-qa-db-fra.com

Publication complète déclenchée par LinkButton dans GridView dans UpdatePanel

J'ai un GridView à l'intérieur d'un UpdatePanel. Dans un champ de modèle, il y a un bouton que j'utilise pour marquer des éléments. Fonctionnellement, cela fonctionne bien, mais le bouton déclenche toujours une publication de page entière au lieu d'une publication partielle. Comment puis-je obtenir le bouton pour déclencher une publication partielle?

<asp:ScriptManager ID="ContentScriptManager" runat="server" />
<asp:UpdatePanel ID="ContentUpdatePanel" runat="server" ChildrenAsTriggers="true">
    <ContentTemplate>
        <asp:GridView ID="OrderGrid" runat="server" AllowPaging="false" AllowSorting="false"
            AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField HeaderText="">
                    <ItemTemplate>
                        <asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete"
                            CommandName="MarkAsComplete" CommandArgument='<%# Eval("Id") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="Name" HeaderText="Name" />
                <asp:BoundField DataField="LoadDate" HeaderText="Load Date" />
                <asp:BoundField DataField="EmployeeCutOffDate" HeaderText="Cut Off Date" />
                <asp:BoundField DataField="IsComplete" HeaderText="Is Completed" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
38
Kevin Albrecht

Vous devez enregistrer chaque LinkButton en tant que AsyncPostBackTrigger. Une fois que chaque ligne est liée dans votre GridView, vous devez rechercher le LinkButton et l’enregistrer dans le code-behind comme suit:

protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)  
{  
   LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;  
   ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);  
}  

Cela nécessite également que ClientIDMode="AutoID" soit défini pour le LinkButton, comme mentionné ici (merci à Răzvan Panda pour l'avoir signalé).

75
NakedBrunch

Ce n'est probablement pas conseillé, mais vous pouvez tout faire fonctionner de manière asynchrone sur GridView en excluant le nom d'événement sur AsyncPostBackTrigger afin.

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>

Cela fera en sorte que l'événement RowCommand et tout autre événement sur GridView se déclenchent de manière asynchrone. Notez également que lorsque vous définissez ClientIDMode = "Static" sur GridView, une publication complète sera générée.

5
Ewert

Ma vue de grille est en mode conditionnel.

protected void gvAgendamentoExclui_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            LinkButton lnk = e.Row.FindControl("LinkButton2") as LinkButton;
            AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
            trigger.ControlID = lnk.UniqueID;
            trigger.EventName = "Click";
            UpdatePanel2.Triggers.Add(trigger);

        }
    }

Et dans l'événement click du linkbutton j'ai mis:

protected void LinkButton2_Click(object sender, EventArgs e)
    {
        UpdatePanel2.Update();
    }
4
sahar

MSDN spécifie que la propriété UpdatePanel.ChildrenAsTriggers "[g] ets ou définit une valeur indiquant si les publications des contrôles enfant immédiats d'un contrôle UpdatePanel mettent à jour le contenu du panneau" (voir http://msdn.Microsoft.com/en- us/library/system.web.ui.updatepanel.childrenastriggers.aspx ).

Étant donné que votre LinkButton ne semble pas être un "contrôle enfant immédiat", je vous recommande de configurer votre LinkButton en tant qu'AsyncPostBackTrigger explicite.

Sous votre balise </ ContentTemplate>, essayez d'ajouter ceci:

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
1
Matthew Rodatus

Placez l'élément suivant dans l'élément system.web dans le fichier web.config

<xhtmlConformance mode="Transitional"/>
1
Sukhjeevan

J'ai eu un problème où j'avais un formulaire qui fonctionnait bien (page1), un autre faisant des retours entiers (page2). Quand je me suis retrouvé à la deuxième page, j’avais fait un peu trop de cut/paste et il y avait toujours un appel javascript dans la définition du formulaire. 

< form id="form1" runat="server" onsubmit="return checkstuff();">

Mais checkstuff n'était pas défini dans page 2.

supprimé la onsubmit et les posts partiels ont commencé à fonctionner. 

Dans la page de travail - page 1, checkstuff était défini, mais était simplement un talon, qui ne faisait que restituer la valeur true. Juste pour sourire, je mets une alerte dans checkstuff, et bien sûr, elle est appelée pour toutes les soumissions, partielles ou non. Et, si je changeais le talon pour renvoyer faux, rien ne se passerait du tout.

Point dans tout cela, le javascript est toujours exercé, comme si une page complète était soumise. Donc, vérifiez vos scripts côté client.

0
mike

cela peut être ancien, mais ma solution a été de mettre un panneau de mise à jour à l'intérieur de itemTemplate et un autre à l'extérieur de gridview.

le déclencheur doit être le gridview et le déclencheur extérieur doit être le gridview et le PageIndexChanging. Essayez ça.

0
user4014903