2009-10-22 7 views
2

J'ai un panneau de mise à jour dans une cellule pour chaque ligne dans une grille. L'utilisateur clique sur un bouton de lien de ce panneau de mise à jour pour afficher (en utilisant window.open()) une fenêtre contextuelle. Une action est effectuée dans cette fenêtre qui met à jour les données contenues dans le panneau de mise à jour mentionné ci-dessus. Je veux déclencher une mise à jour uniquement pour ce panneau de mise à jour lorsque la fenêtre contextuelle est fermée.Comment déclencher une publication de panneau de mise à jour à partir d'une page enfant?

Quelle est la meilleure façon de faire cela? Je recherche la capture de l'événement window.close et en passant en quelque sorte une valeur qui indique d'où la fenêtre contextuelle a été appelée, puis en appelant une publication pour ce panneau de mise à jour en javascript. Si cela fait une différence (dans le moins ça va - euh - dans mon code javascript), j'utilise une page maître et seulement le codage pour IE.

Trouvé ceci: http://forums.asp.net/p/1166328/1941797.aspx qui utilise le window.opener.document ... Encore une fois, l'utilisation d'une page maître complique les choses.

Répondre

0

Je l'ai fait à partir d'une application Flash. Mon "hack" si vous voulez cacher un vrai ASP: Button avec CSS. Le bouton était à l'intérieur du UpdatePanel. J'ai passé le Button.ClientId à la ressource externe (Flash, nouvelle fenêtre ... etc). Lorsque la ressource externe (Flash dans mon cas) était terminée, elle appelle une fonction JavaScript qui accepte le ClientId et appelle .Click() sur le bouton.

JavaScript:

function CallASPNETClick(id) { 
    var elmt = document.getElementById(id); 
    elmt.click(); 

} 

Markup:

!--this is uses for capture an event from Flash with javascript, do not remove---> 
<asp:Button ID="hiddenButton" runat="server" Text="Button" style="visibility:hidden" OnClick="hiddenButton_Click" /> 
+0

C'est le chemin que j'ai suivi. Le problème que j'ai rencontré est d'ajouter le code pour OnClientClick dans le code derrière qui utilise l'ID du bouton caché (j'utilise une page maître, donc l'identifiant est préfixé avec "ctl00_MasterContentHolder_grdResources_ctl02 _...") JavaScript n'est pas appelé quand j'ajoute l'appel dans le code derrière. Je l'ajoute comme ceci dans l'événement OnLoad: btnAdd.OnClientClick = "callback ('" + sUpdateButtonID + "');"; – JBoyd

+0

Que se passe-t-il si vous codez le JavaScript comme un test? Si vous utilisez l'ID client du contrôle, il résoudra son conteneur d'attribution de noms pour vous. –

+0

@JBoyd - au lieu de simplement utiliser SUpdateButtonID, utilisez SUpdateButton.ClientID. Ce sera l'ID généré ASP avec tous les éléments préfixés qui sont ajoutés à chaque contrôle sur une page. – Ahmad

0

Vous pouvez utiliser des champs cachés sur la page d'appel pour stocker toutes les valeurs dont vous avez besoin pour votre rappel. Le pop-up peut utiliser window.opener pour stocker les valeurs dans ces champs cachés.

Vous pouvez étendre votre fonction window.open pour mettre à jour une variable javascript sur la page avec une référence à l'appelant:

<asp:button onclientclick="buttonClicked(this)" /> 

var lastButton; 
function buttonClicked(button) { 
lastButton = button; 
window.open(x); 
return false; 
} 

Si vous faites les champs cachés asp contrôles, vous aurez accès à leur sur la publication du panneau de mise à jour.

Edit:

Tenir compte d'un ModalPopup pour éliminer les problèmes autour de personnes en cliquant sur la page d'appel alors que vous les attendent à utiliser le menu contextuel.

0

La solution la plus simple (et fonctionnelle) que j'ai choisie était de l'implémenter en utilisant ModalPopupExtender dans un contrôle utilisateur dans la cellule gridview. Le contrôle utilisateur contient la grille de résultats en lecture seule et le ModalPopupExtender. La fenêtre contextuelle vous permet d'éditer le contenu de cette grille dans la cellule de la grille parente. En cliquant sur le bouton Ajouter, la mini-grille est mise à jour de manière asynchrone.

Quelques éléments clés qui m'ont finalement permis de trouver une solution de travail ...

  • Enveloppez le contenu du panneau référencé dans la propriété PopupControlId dans un panneau de mise à jour
  • Masquer et afficher le menu contextuel modal dans le code derrière
  • Un simple et good example d'un GridView en utilisant plusieurs ModalPopupExtenders
+0

Ce lien donne un exemple de remplissage dynamique du panneau afin qu'il ne soit pas recréé pour chaque ligne de la grille: http://www.aspdotnetcodes.com/Ajax_ModalPopup_PostBack_GridView.aspx – JBoyd

+0

J'ai le même problème avec vous mais je ne sais pas comme la façon dont ModalPopupExtender désactive la page parente. – Bastardo

0

Ces deux façons fonctionne pour moi

(1) Via référencement ChildPage de MasterPAge

ContentPlaceHolder_content.FindControl("dvwOrder").Controls.Clear(); 
    ((UpdatePanel)this.ContentPlaceHolder_content.FindControl("upOrders")).Update(); 

Ce code est à l'intérieur page maître et sur mon CLICK J'utilise ContentPlaceHolder pour trouver la référence pour le contrôle à l'intérieur. Ici, dvwOrder est mon DataView et "upOrders" est mon UpdatePanel.

(2) Via Les délégués

Mettre ce délégué et eventhandler sur Maître page en dehors de toute méthode

public delegate void RefreshButtonClickHandler(object 
expéditeur

, EventArgs e); événement public RefreshButtonClickHandler onRefreshButtonClick;

dans l'événement click bouton classe inyour faire ce

 if(null == onRefreshButtonClick) 
     { 
      return;     
     } 

     onRefreshButtonClick(sender, e); 

Puis, dans Page_Load de page enfant Méthode lier cet événement avec gestionnaire locale

 Child child = (child) this.Master; 
     reports.onRefreshButtonClick += new 

enfant . RefreshButtonClickHandler (reports_onRefreshButtonClick);

Ici l'enfant est mon nom de fichier codebehind

créer

void child_onRefreshButtonClick(object sender, EventArgs e) 
    { 

    } 

et vous êtes fait

0

J'abandonné mes efforts pour le faire dans une fenêtre séparée et a développé la solution au lieu d'utiliser un AJAX ModalPopupExtender. Matt Berseth's example était très utile. Pour mettre à jour la grille enfant contenue dans un panneau de mise à jour dans la grille parente, j'ai stocké la valeur de la ligne à partir de laquelle le bouton a été cliqué dans une variable de session, puis la méthode databind de la grille enfant l'utilisateur avait fait ses sélections et cliqué sur sauvegarder.

protected void btnShowSkillsetPopup_Click(object sender, EventArgs e) 
{ 
    // get the gridviewrow from the sender so we can get the datakey we need 
    Button btnAddSkillsetsFromRow = sender as Button; 
    GridViewRow row = (GridViewRow)btnAddSkillsetsFromRow.NamingContainer; 

    Session["CapRes_ResourceRequestID"] = Convert.ToString(this.grdResources.DataKeys[row.RowIndex].Value); 
    Session["CapRes_SkillsetUpdatePanel_Row"] = Convert.ToString(row.RowIndex); 
    ModalPopupExtender.Show(); 
} 

Enregistrer le code ...

int nUpdatePanelID = Convert.ToInt32(Session["CapRes_SkillsetUpdatePanel_Row"].ToString()); 
UpdatePanel pnlSkillsetsMain = grdResources.Rows[nUpdatePanelID].FindControl("pnlSkillsetsMain") as UpdatePanel; 
GridView grdSkillsets = pnlSkillsetsMain.Controls[0].FindControl("CascadingSkillsets1").FindControl("grdSkillsets") as GridView; 
grdSkillsets.DataBind(); 

ModalPopupExtender.Hide(); 
1

Vous pouvez utiliser javascript __doPostBack fonction ('EventTarget', 'eventArgument'). Du côté client peut-être ressemble à ceci. Côté serveur, vous devez utiliser le panneau de mise à jour avec UpdateMode = le bouton conditionnel et caché comme le dit rick schott. La partie difficile est de savoir quelle cellule doit être mise à jour. Si vous avez activé OnClick pour le bouton caché, il déclenchera cet événement lorsque __doPostBack sera appelé. Vous pouvez accéder à Request.Form ["__ EVENTARGUMENT"] depuis le serveur pour accéder à la valeur envoyée par __doPostBack. Vous pouvez jouer avec cette valeur par exemple quelle cellule doit être mise à jour.

+0

+1 car c'était la même idée que j'avais et une bonne explication. Aussi @JBoyd lire ceci pour de plus amples informations http://aspalliance.com/895 sur l'événement javascript __doPostBack. En utilisant cette méthode, je crois que vous pouvez déclencher la mise à jour maintenant limité au panneau de mise à jour spécifique. Sur l'aspect quand il est fermé, vous pouvez utiliser un bouton de fermeture par opposition à l'événement window.close et lier le jscript en conséquence. – Ahmad

Questions connexes