none
Per Silverlight-Webresource ein Lookup befüllen? RRS feed

  • Frage

  • Guten Morgen liebe CRMler,

    ich steh mal wieder aufm Schlauch. Ich schreibe gerade an einer Silverlight-Webresource, welche auf einer dynamischen Entätit sitzt und mit eingebenen Werten entweder einen neuen Kontakt oder eine neue Firma erstellt. Nach der erstellung jedoch, soll der erstellte Kontakt (oder Firma) in ein dafür vorgesehenes Lookupfeld eingetragen werden.

    Ich spiele dabei auf die XRM-Komponente an, auf die man während der Laufzeit über die Silverlight-Webresource zugreifen kann.

    Gemeint ist sowas wie:

    dynamic xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
    xrm.Page.data.entity.attributes.get("new_name").setValue("Test");
    

    Mit stinknormalen Textfeldern funktioniert dies ja tadellos. Probleme hab ich hier ja nur bei den besagten Lookupfelder. Alle Daten, die für das befüllen von Nöten sind (Id, typename und name) sind vorhanden.

    Man könnte im Hintergrund in der gerade geöffneten Entität eine Relation zu der besagten Firma oder Kontakt hinzufügen, was der Benutzer aber nicht gleich auf anhieb sehen würde. Dieser Weg ist zwar möglich, finde ich aber irgendwie doof! Wäre also schön, wenn es über das ScriptObject möglich wäre! =D

    Ich freue mich auf eine baldige Antwort und danke euch schonmal im Vorraus! =D

     

    mfg Jasper

     

    Donnerstag, 1. Dezember 2011 08:34

Antworten

  • Hallo Jasper,

    Ich dachte, dass sei die leichteste Lösung - selber habe ich das so noch nie gemacht. Jetzt habe ich die Anforderung selber in einer Testumgebung probiert und kam auf diesem Weg auch auf keine Lösung. Auch eine erneute Web-Suche brachte mich eigentlich nicht weiter.

    In folgendem Blogeintrag wird die Anforderung über ein Javascript-Function in der HTML-Seite gelöst: http://community.dynamics.com/product/crm/crmtechnical/b/crminogic/archive/2011/09/13/how-to-interact-with-crm-form-fields-from-within-the-silverlight-page.aspx . Hier schreibst du die Javascript-Functions wie gewohnt in die HTML-Seite, in der Silverlight gehostet wird. Die Funktion rufst du dann mittels .Invoke("<Name>", <Parameter>) auf. So solltest du dein Problem auch lösen können.

    Liebe Grüße,

    Andreas


    Andreas Buchinger
    Microsoft Dynamics Certified Technology Specialist
    MCPD: SharePoint Developer 2010
    • Als Antwort markiert Jasper Gandyra Donnerstag, 8. Dezember 2011 10:23
    Montag, 5. Dezember 2011 12:19
  • Guten Morgen Andreas,

    tschuldige,  dass ich etwas länger nicht geantwortet habe. Ich habe nun zwei Lösungen ausprobiert. Deine funktioniert erstmal tadellos. Danke dafür! =D
    Bei meinem Projekt binde ich jedoch die .xap des Silverlightprojektes direkt ein und gehe nicht den Umweg über eine HTML-Seite welches das Silverlight hostet. Ergo kann ich keine Funktionen auf einer HTML-Seite aufrufen, da es Diese ja nicht gibt.

    Mit der Funktion HtmlPage.Window.Eval kann man jedoch direkt im C# ein Javascript ausführen und sich z.B. ein Object zurückgeben lassen.

    Sieht dann so aus:

    string lookupString = String.Empty;
                    lookupString += "(function() {";
                    lookupString += "var lookupArray = new Array(); ";
                    lookupString += "var lookupObject = new Object(); ";
                    lookupString += "lookupObject.id = '" + guid + "'; ";
                    lookupString += "lookupObject.name = '" + targetEntityName + "'; ";
                    lookupString += "lookupObject.typename = 'account'; ";
                    lookupString += "lookupArray[0] = lookupObject; ";
                    lookupString += "return lookupArray;";
                    lookupString += "})()";
    
                    ScriptObject lookupObject = (ScriptObject)HtmlPage.Window.Eval(lookupString);
    
                    xrm.Page.data.entity.attributes.get("lookup").setValue(lookupObject);
    


    War für den Aufbau meines Projektes besser geeignet, dennoch hast du mich auf den richtigen Weg gebracht!

    Also noch einmal vielen herzlichen Dank und noch einen schönen Tag!

     

    MfG Jasper

    • Als Antwort markiert Jasper Gandyra Donnerstag, 8. Dezember 2011 10:23
    Donnerstag, 8. Dezember 2011 10:23

Alle Antworten

  • Hallo Jasper,

    Hast du es mit folgendem Aufruf schon probiert:

    xrm.Page.data.entity.attributes.get("<FieldSchemaName>").setValue( [ {id: idValue, name: textValue, entityType: typeValue} ]);
    

    Bekommst du einen Fehler, wenn du das Lookup setzt?

    Liebe Grüße,

    Andreas


    Andreas Buchinger
    Microsoft Dynamics Certified Technology Specialist
    MCPD: SharePoint Developer 2010
    Donnerstag, 1. Dezember 2011 15:33
  • Moin Andreas,

    leider schmeisst mir Visual Studio bereits bei der Syntax einen Fehler, kann es also noch nicht mal kompilieren, debuggen oder dergleichen. Mit Jscript geht dein Code wunderbar. Mache ich ja jeden Tag. Aber mit C# scheint es irgendwie nicht so leicht zu gehen oder ich bin einfach zu blöde! =D

    Was mich ein wenig vom Verständniss her weiter voran gebracht hat ist:

    http://msdn.microsoft.com/en-us/library/gg334409.aspx#BKMK_setValue

     

    Aber auch, wie unten beschrieben, ein Array zu erzeugen, in den mehrere Objects vorhanden sind, welche mit den drei Werten befüllt wird, hat bei mir mal garnicht geklappt. Gibt es vielleicht explizit ein Lookupobject oder dergleichen? Wenn ja dann hab ich es bis jetzt nicht entdecken können. =D

     

    MfG Jasper

     

     

     

     

     

    Montag, 5. Dezember 2011 09:10
  • Hallo Jasper,

    Ich dachte, dass sei die leichteste Lösung - selber habe ich das so noch nie gemacht. Jetzt habe ich die Anforderung selber in einer Testumgebung probiert und kam auf diesem Weg auch auf keine Lösung. Auch eine erneute Web-Suche brachte mich eigentlich nicht weiter.

    In folgendem Blogeintrag wird die Anforderung über ein Javascript-Function in der HTML-Seite gelöst: http://community.dynamics.com/product/crm/crmtechnical/b/crminogic/archive/2011/09/13/how-to-interact-with-crm-form-fields-from-within-the-silverlight-page.aspx . Hier schreibst du die Javascript-Functions wie gewohnt in die HTML-Seite, in der Silverlight gehostet wird. Die Funktion rufst du dann mittels .Invoke("<Name>", <Parameter>) auf. So solltest du dein Problem auch lösen können.

    Liebe Grüße,

    Andreas


    Andreas Buchinger
    Microsoft Dynamics Certified Technology Specialist
    MCPD: SharePoint Developer 2010
    • Als Antwort markiert Jasper Gandyra Donnerstag, 8. Dezember 2011 10:23
    Montag, 5. Dezember 2011 12:19
  • Guten Morgen Andreas,

    tschuldige,  dass ich etwas länger nicht geantwortet habe. Ich habe nun zwei Lösungen ausprobiert. Deine funktioniert erstmal tadellos. Danke dafür! =D
    Bei meinem Projekt binde ich jedoch die .xap des Silverlightprojektes direkt ein und gehe nicht den Umweg über eine HTML-Seite welches das Silverlight hostet. Ergo kann ich keine Funktionen auf einer HTML-Seite aufrufen, da es Diese ja nicht gibt.

    Mit der Funktion HtmlPage.Window.Eval kann man jedoch direkt im C# ein Javascript ausführen und sich z.B. ein Object zurückgeben lassen.

    Sieht dann so aus:

    string lookupString = String.Empty;
                    lookupString += "(function() {";
                    lookupString += "var lookupArray = new Array(); ";
                    lookupString += "var lookupObject = new Object(); ";
                    lookupString += "lookupObject.id = '" + guid + "'; ";
                    lookupString += "lookupObject.name = '" + targetEntityName + "'; ";
                    lookupString += "lookupObject.typename = 'account'; ";
                    lookupString += "lookupArray[0] = lookupObject; ";
                    lookupString += "return lookupArray;";
                    lookupString += "})()";
    
                    ScriptObject lookupObject = (ScriptObject)HtmlPage.Window.Eval(lookupString);
    
                    xrm.Page.data.entity.attributes.get("lookup").setValue(lookupObject);
    


    War für den Aufbau meines Projektes besser geeignet, dennoch hast du mich auf den richtigen Weg gebracht!

    Also noch einmal vielen herzlichen Dank und noch einen schönen Tag!

     

    MfG Jasper

    • Als Antwort markiert Jasper Gandyra Donnerstag, 8. Dezember 2011 10:23
    Donnerstag, 8. Dezember 2011 10:23