2009-07-13 4 views
0

Ich habe meine benutzerdefinierte NewForm.aspx für meine Liste gemacht und ich möchte etwas benutzerdefinierten Code hinzufügen. Also ich erben diese Form aus meiner eigenen Klasse:Referenz benutzerdefinierte Liste Formularfelder aus Code hinter und fülle sie automatisch mit Werten

public class MyCustomNewForm : Microsoft.SharePoint.WebPartPages.WebPartPage 

Jetzt möchte ich einige der verfügbaren Felder verweisen sie automatisch für den Benutzer zu füllen. (Javascript hilft hier nicht, da ich einige Daten von anderen Listen bekommen muss).

Aber ich habe keine Ahnung, wie ich diese Felder von Codebehind-Dateien referenzieren.

Der Code für Steuerfeld geschrieben wird (na ja, es von Sharepoint Designer erstellt wurde, wenn der Befehl Einfügen> Sharepoint-Steuerelemente verwenden> Benutzerdefinierte Liste Formular ...) in ASPX-Seite wie folgt aus:

<SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/> 

Wenn bei id zur Laufzeit sucht, ist es irrsinnig lange

alt text http://img33.imageshack.us/img33/7495/ss20090713143352.png

so wie Referenz i Felder, so dass ich Text einstellen könnte Eigenschaft auf sie in meiner Codebehind-Datei?

Antwort

0

Denken Sie nicht an diese schmerzhafte Lösung, aber scrollen Sie nach unten, um zu sehen, bearbeiten.

Uhh, ich habe einen Workaround gefunden. Aber Warnung! Wenn Sie keine Sharepoint-Objekte verwenden müssen, um dynamisch auf Werte zuzugreifen, ist dieser Beitrag nicht für Sie gedacht. Stattdessen möchten Sie einige der referenzierten Artikel lesen.

Um also einige Felder in einer NewForm.aspx mit Werten aus einer anderen Liste vorzufüllen, gehen Sie folgendermaßen vor.

Kurz:

  1. Machen Sie Ihre benutzerdefinierte Liste Artikelformular. Tun Sie es step-by-step.

  2. eine Klasse machen, die Microsoft.SharePoint.WebPartPages.WebPartPage

  3. Inherit diese Klasse auf Ihrer benutzerdefinierten Form aspx <% @ Page von erbt. Mine sieht wie folgt aus: Inherits="xx.MeetingWorkspace.Tasks_NewFormxx, xx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"

  4. In protected override void OnInit(EventArgs e) Funktion Gebrauch FindControlRecursively ein Content Objekt mit der ID "PlaceHolderMain" zu finden (Call dass Funktion auf this.Controls [0], nicht auf dieses Objekt).

  5. Stellen Sie HtmlHiddenField Objekte her, weisen Sie Werte zu und fügen Sie das Attribut "Title" mit der Methode HtmlHiddenField.Attributes.Add() hinzu. Sie werden das für Schritt 7 benötigen.

  6. Fügen Sie dem ContentPlaceHolder versteckte Felder hinzu, die Sie vorher haben.

  7. Verwenden Javascript (lesen here oder here) zu füllen Sie Ihre gewünschten Felder aus versteckten Feldwerte auf diese Felder die Benutzer sieht.

P.S. Ich bin Anfänger am Sharepoint, also benutze diese Schritte besser mit cauntion. Ich würde froh sein, eine Antwort zu finden, wo Sie Ihre Felder im Code verweisen können, also muss ich Javascript-Zeug nicht verwenden.

Meine Reise in lange: Wie ich bereits erwähnt habe ich meine eigene öffentliche Klasse für dieses Formular geerbt. Mit dieser Technik sollte es möglich sein, auf ein vorhandenes Formularfeld zu verweisen, indem diese Klassensteuerelemente mit einem Variablennamen wie der Formular-ID deklariert werden. Im Screenshot habe ich ein TextBox Klasse-Objekt mit ID ctl00_PlaceHolderMain_g_77625 .... usw.

nun in meiner Klasse I mit dem gleichen Namen wie ID macht eine Variable versucht, aber es nicht initialisiert werden und der Wert null . Ich dachte, vielleicht wird ID geändert, ich habe überprüft, aber nein, es bleibt so wie es vorher war.

So versuchte ich mit Control.FindControl, aber es rekursiv nicht suchen, so fand ich diesen Artikel: Recursive Page.FindControl. (Sie würden wahrscheinlich einige Kommentare lesen wollen, da es bessere Implementierungen mit Generika gibt). Wichtig: Lesen Sie den Kommentar "Sam am 2. August 2008 4:13", bevor Sie die FindControlRecursive-Methode verwenden.

Also, mit der Funktion in der Hand, übergab ich die ID als Argument - immer noch kein Glück, es gibt nur null für mich zurück. Glücklicherweise konnte ich PlaceHolderMain als ID übergeben und es würde mir das Hauptplatzhalterobjekt zurückgeben.

Also die Problemumgehung wäre dann auf die überschriebene Methode OnInit(EventArgs) machen HtmlHiddenField Objekte, setzen Sie ihre Werte auf was auch immer Sie wollen und diese versteckten Felder zu PlaceHolderMain hinzufügen. (ContentPlaceHolder.Controls.Add())

Dann mit etwas Javascript ASPX Seite war ich in der Lage Werte von den ausgeblendeten Feldern meiner preffered Felder zu laden (gut fand ich einen Weg, um die Felder, die ich mit Javascript Zwei nützliche Artikel für diese wollen verweisen. shorter one und longer one)

Edit: Weniger schmerzhafte Lösung

Ohh, froh, dass ich fand diese. Mit jPoint (jQuery für SharePoint) und dann mit einigen Skript können Sie Querystring-Parameter zum Auffüllen von Listenfeldern verwenden.

<script type="text/javascript" src="//sharejpoint.googlecode.com/files/jPointLoader-0.6-expanded.js" ></script> 
<script> 
    $(document).ready(function() { 
    jP.Form.readForm(); 
    $.each(jP.Form.Items, function (idx, item) { 
    if(querySt(item.Name) != null && querySt(item.Name) != "undefined") 
     jP.Form[item.Name].val(unescape(querySt(item.Name))); 
    }); 
    }); 

//Gets value of querystring key 
function querySt(ji) 
{ 
     hu = window.location.search.substring(1); 
     gy = hu.split("&"); 
     for (i=0;i<gy.length;i++) 
     { 
       ft = gy[i].split("="); 
       if (ft[0].toUpperCase() == ji.toUpperCase()) //Fixed query so it is case insensitive 
       { 
         return ft[1]; 
       } 
     } 
} 
</script> 

Dieses Skript kann in Kommentaren in this Artikel gefunden werden.

1

Verwenden Sie WebDataForm Kontrolle in Ihrem Code hinter; Rufen Sie die Methode FindControl(@ID) auf.

Sie können herausfinden, die ID von der Seite HTML generiert; Verwenden Sie IE-Entwickler-Tools sollte es $ff21_ zum Beispiel sein, die in diesem Fall ID = ff21