2010-12-15 6 views
0

J'écris un composant WebPart personnalisé qui nécessite l'utilisation de deux contrôles de zone de texte enrichi. Je place les contrôles sur la partie Web par programme. Lorsque la partie Web obtient une publication de sauvegarde, je suis capable de capturer les données de tous les champs, à l'exception des deux zones de texte enrichi. Quel est le truc pour être en mesure d'obtenir la valeur d'une boîte de texte riche?SharePoint obtient la valeur du contrôle de zone de texte enrichi créé par programme

Le code I "m à l'aide de placer mes contrôles de formulaire est:

private void CreateInputControls() 
    { 
     inputPanel.Controls.Clear(); 

     SPList list = SPContext.Current.Site.RootWeb.Lists["MyList"]; 
     SPContentType cType = list.ContentTypes[0]; 

     Table table = new Table(); 
     table.CellPadding = 3; 
     table.CellSpacing = 0; 

     SPContext newContext = SPContext.GetContext(System.Web.HttpContext.Current, list.DefaultView.ID, list.ID, list.ParentWeb); 

     foreach (SPField field in cType.Fields) 
     { 
      if (!field.Hidden && field.CanBeDisplayedInEditForm) 
      { 
       FieldLabel fieldLabel = new FieldLabel(); 
       fieldLabel.ControlMode = SPControlMode.New; 
       fieldLabel.ListId = list.ID; 
       fieldLabel.FieldName = field.InternalName; 
       fieldLabel.ItemContext = newContext; 
       fieldLabel.RenderContext = newContext; 
       fieldLabel.Field.Required = fieldLabel.Field.Required; 

       FormField formField = new FormField(); 
       formField.ControlMode = SPControlMode.New; 
       formField.ListId = list.ID; 
       formField.FieldName = field.InternalName; 
       formField.ItemContext = newContext; 
       formField.RenderContext = newContext; 
       formField.ID = field.InternalName; 
       formField.EnableViewState = true; 

       TableRow row = new TableRow(); 
       table.Rows.Add(row); 

       TableCell cellLabel = new TableCell(); 
       TableCell cellField = new TableCell(); 

       cellLabel.Controls.Add(fieldLabel); 
       cellField.Controls.Add(formField); 
       row.Cells.Add(cellLabel); 
       row.Cells.Add(cellField); 
      } 
     } 

     inputPanel.Controls.Add(table); 
    } 

Le code que je utilise pour enregistrer un nouvel élément est:

private void UpdateItem(string bannerImageURL, string thumbnailImageURL) 
    { 
     SPList list = SPContext.Current.Site.RootWeb.Lists["MyList"]; 
     SPContentType cType = list.ContentTypes[0]; 
     SPItem item = list.AddItem(); 

     foreach (SPField field in cType.Fields) 
     { 
      if (!field.Hidden && field.CanBeDisplayedInEditForm) 
      { 
       FormField formField = (FormField)inputPanel.FindControl(field.InternalName); 

       if (formField != null) 
       { 
        // Saves data for all fields EXCEPT for rich text box (sharepoint multiline columns). 
        item[field.Title] = formField.Value; 
       } 
      } 
     } 

     item.Update(); 
    } 
+0

Lorsque le contrôle RTE se trouve, est la 'formField' nulle variables ou pas? –

+0

sipwiz, si vous avez résolu le problème, s'il vous plaît, dites comment. – Kai

Répondre

0

Peut-être qu'il ya un problème avec la Nom du champ Essayez d'utiliser le nom interne

item[field.InternalName] = formField.Value; 
0

J'ai été aux prises avec cela et j'utilise une solution de contournement qui Je pensais poster, car c'était assez frustrant.

Le problème est que le contrôle RTE est rendu vide, puis rempli à partir d'un contrôle caché avec JavaScript sur le client. Toutefois, ce contrôle est caché côté serveur accessible ainsi:

switch (formField.Field.Type) 
{ 
    case SPFieldType.Note: 
     var rtf = (RichTextField)formField.Controls[0]; 
     item[field.Title] = rtf.HiddenInput.Value; 
     break; 
    default: 
     item[field.Title] = formField.Value; 
     break; 
} 

Cela peut avoir besoin pour étendre d'autres types de champs, mais vous voyez l'idée ...

Questions connexes