2009-09-24 4 views
1

Modifier en bas avec une solutionPersistant entrée de l'utilisateur pour le contrôle dynamique dans SharePoint Web Part

J'ai vu une question semblable à celui affiché avant et ont essayé les suggestions, mais je dois manquer quelque chose. Mon problème de base est le suivant: j'ai une boîte de sélection où l'utilisateur peut sélectionner un filtre qui peut contenir ou non des contraintes (nécessite que l'utilisateur saisisse d'autres données pour que le filtre sache comment filtrer). Comme on ne sait pas exactement combien de contraintes existeront pour le filtre, j'essaie de les charger dynamiquement et de les ajouter à un panneau d'espace réservé que j'ai. Le bon nombre de contraintes se charge juste bien et dandy, mais quand l'utilisateur entre le texte et les coups soumettent, après la recharge de la page aucune des valeurs persistent. Voici le code approprié (je peux fournir plus si nécessaire):

Je ces comme variables de classe pour ma part Web:

Panel constraintPanel; 
HtmlInputText[] constraints; 
Label[] constraintLabels = null; 

l'intérieur d'un CreateChildControls override j'initialiser le panneau:

constraintPanel = new Panel(); 

Je construis dans les boîtes de saisie dynamiques dans un OnPreRender substitué (Note: J'ai entendu des gens dire de le faire dans OnInit, OnLoad, ou OnPreRender, mais OnPreRender est le seul qui ne fait pas sortir toute l'erreur du composant WebPart) :

protected override void OnPreRender(EventArgs e) 
{ 
    buildConstraints(); 
    base.OnPreRender(e); 
} 

private void buildConstraints() 
{ 
    if (!viewSelect.SelectedValue.Equals(INConstants.NoFilterOption)) 
    { 
     string[,] constraintList = docManager.GetFilterConstraints(viewFilterSelect.SelectedValue); 
     if (constraintList != null) 
     { 
      this.constraints = new HtmlInputText[constraintList.Length/2]; 
      this.constraintLabels = new Label[constraintList.Length/2]; 
      for (int constraintCount = 0; constraintCount < constraintList.Length/2; constraintCount++) 
      { 
       Label constraintLabel = new Label(); 
       constraintPanel.Controls.Add(constraintLabel); 
       constraintLabel.Text = constraintList[constraintCount, 0]; 
       this.constraintLabels[constraintCount] = constraintLabel; 

       HtmlInputText constraint = new HtmlInputText(); 
       constraintPanel.Controls.Add(constraint); 
       constraint.ID = "constraint_" + constraintCount; 
       constraint.MaxLength = 12; 
       constraint.Style.Add("FONT-FAMILY", "Verdana"); 
       constraint.Style.Add("FONT-SIZE", "11"); 
       this.constraints[constraintCount] = constraint; 
      } 
     } 
    } 
} 

Et puis enfin dans un RenderWebParts redéfinies j'ai (ndlr: J'ai aussi essayé en boucle à travers les contraintes de tableaux et constraintLabels pour rendre les contrôles, mais il n'a fait aucune différence):

... 
constraintPanel.RenderBeginTag(output); // not sure if this is needed 
if (constraints != null && constraints.Length > 0) 
{ 
    foreach (Control tempControl in constraintPanel.Controls) 
    { 
     if (tempControl is Label) 
     { 
      output.WriteLine("<tr>"); 
      output.WriteLine("<td width='2%' nowrap><font class='search-header'>"); 
      tempControl.RenderControl(output); 
      output.WriteLine("&nbsp;"); 
     } 
     else if (tempControl is HtmlInputText) 
     { 
      tempControl.RenderControl(output); 
      output.WriteLine("</td>"); 
      output.WriteLine("<td width='*' nowrap></td>"); 
      output.WriteLine("</tr>"); 
     } 
    } 
} 
constraintPanel.RenderEndTag(output); // not sure if this is needed 
... 

Je vous remercie toute aide, car cela me rend vraiment fou.

Modifier avec une solution:

J'ai été en mesure de le faire fonctionner. J'avais besoin de surcharger l'événement OnLoad et d'envelopper mes appels à partir de là dans un bloc try-catch. Pour une raison quelconque, le chargement de la page initiale déclenche une exception lors de la tentative d'exécution, ce qui entraîne l'affichage de la page entière. J'ai également oublié d'ajouter mon constraintPanel à la liste des contrôles.

est ici le code OnLoad pour l'amour de l'information:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    try 
    { 
     viewsBuildConstraints(); 
    } 
    catch (Exception) 
    { 
    } 
} 

Répondre

2

Essayez marquer votre webpart avec l'interface INamingContainer et assurez-vous de donner à tous les contrôles d'identité. En outre, les contrôles HtmlInput n'ont pas d'affichage viewstate, ce qui les amènerait à "oublier" l'entrée après une publication. Pourriez-vous essayer d'utiliser les contrôles TextBox réels?

+0

En fait, j'ai fini par donner des ID uniques aux boîtes d'entrée. J'ai découvert qu'ils sauvaient l'état, je les construisais juste au mauvais moment. J'ai édité ma question pour refléter cela. – Adam

+0

Heureux de vous voir trouvé une solution de contournement. Cela ressemble à un quickfix cependant .... Je vous encourage à creuser plus profondément quand vous avez le temps ... – Colin

+0

J'ai eu un problème similaire avec les contrôles TextBox ne préservant pas leur état. Ajoutant simplement le INamingContainer aidé. – bryanbcook

Questions connexes