2

プライマリ エンティティ フォームからサブ エンティティを編集できる Silverlight グリッドを作成しました。チャンピオンのように機能します。ただし、Silverlight コントロールに別の保存ボタンを配置して、更新を CRM にプッシュする必要があります。ここでやりたいことは、CRM フォームが Silverlight コントロールのメソッドを呼び出して、フォームが保存中であることを警告し、同時にデータを Silverlight フォームに保存できるようにすることです。しかし、それは機能していません。これまでに試したことは次のとおりです。

Silverlight コントロールには、パブリック クラスがあります。


[ScriptableType]
    public class JSModel
    {
       [ScriptableMember]
       public void Save()
       {
           if (OnSave != null)
           {
               OnSave(this, new EventArgs());
           }
       }

   public event EventHandler OnSave;

   public JSModel()
   {

       HtmlPage.RegisterScriptableObject("JSModel", this);

       HtmlPage.Window.Eval(
           @"
           function CallSLSave()

{var sl = Xrm.Page.ui.controls.get('" + HtmlPage.Plugin.TagName + @"');

sl.content.JSModel.Save();} ");

       ScriptObject xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
       ScriptObject Page = (ScriptObject)xrm.GetProperty("Page");
       ScriptObject data = (ScriptObject)Page.GetProperty("data");
       ScriptObject entity = (ScriptObject)data.GetProperty("entity");
       entity.Invoke("addOnSave", new object[] { "CallSLSave" });


   }

}

しかし、それは javascript メソッドを呼び出していません。私たちが間違っていることを知っている人はいますか?

4

2 に答える 2

1

HTML ブリッジの魔法のおかげで、デリゲートを addOnSave メソッドのパラメーターとして使用できます。Javascript ブートストラップ関数や、ページ上のスクリプト可能なオブジェクトは必要ありません。これにより、これに対するソリューションが簡素化されます。

    void SetupHook()
    {
        var xrm = (ScriptObject)HtmlPage.Window.GetProperty("Xrm");
        var page = (ScriptObject)xrm.GetProperty("Page");
        var data = (ScriptObject)page.GetProperty("data");
        var entity = (ScriptObject)data.GetProperty("entity");

        entity.Invoke("addOnSave", new Func<bool>(SaveHook));
    }

    private bool SaveHook()
    {
        // ... Do save stuff here ...
        return true;
    }

また、注意:呼び出す関数は、スクリプト可能なメンバーである必要はありません。

于 2011-06-06T08:01:15.033 に答える
1

あなたが間違っているのは :Invoke("addOnSave"... Invoke の最初の引数は JavaScript 関数です。収集すると、addOnSave は C# です。

Save click EventHandler を使用して、MainPage に通常のボタンを配置するだけです。

MainPage.cs で:

  [ScriptableMember]
    private void Save(object sender, RoutedEventArgs e)
    {
    HtmlPage.RegisterScriptableObject("scriptableControl", this); 
        HtmlPage.Window.Eval(@"function CallSLSave()
       { var sl = document.getElementById('silverlightControl');  sl.Content.scriptableControl.addOnSave();}");
    HtmlPage.Window.Invoke("CallSLSave");


//or the way you do except for entity.Invoke("addOnSave" should be  entity.Invoke("CallSLSave");
    }

    [ScriptableMember]
    public void addOnSave()
    {
        ...
    }
于 2011-05-06T22:57:42.343 に答える