【GeneXus】C#でExternal Object(その3)

C#でExternal Objectを作成した時の備忘録。

一応流れ的なことと、引数の渡し方を中心に書きます。
あくまでも個人的にやった結果なので、他のやり方もあるだろうし
もっといい方法もいっぱいあると思います。

参考リンク


参考
カテゴリ:外部オブジェクトwiki.genexus.jp

環境

GeneXus16
Visual Studio Community 2019

事前準備

その2の続きです。

SDT(List)

SDTをListでC#プロジェクト側で処理したい場合です。

まずはSDTをListで保持するクラスを作成。

SDTControl.cs

using System.Collections.Generic;

namespace AddClassLibrary
{
    public class SDTControl
    {

        public List SdtCollection { get; set; }

        public SDTControl() 
        {
            SdtCollection = new List();
        }

        public void SdtAdd(GeneXus.Utils.GxUserType sdt)
        {
            SdtCollection.Add(sdt);
        }
    }
}

SDTControl.csを引数として受け取るメソッドをGxCsTest作成。

GxCsTest.cs

using System;

namespace AddClassLibrary
{
    public class GxCsTest
    {
        public static string GetString(String str)
        {
            var test = "C# Add Library";
            return str + ":" + test;
        }

        public static string SdtString(GeneXus.Utils.GxUserType sdt)
        {
            var test = sdt.ToJSonString();
            return test;
        }

        public static int SdtCount(SDTControl sdtcol)
        {
            try
            {
                return sdtcol.SdtCollection.Count;
            }
            catch (Exception ex)
            {
                return 0;
            }
        }

        public static String SdtControlString(SDTControl sdtcol)
        {
            var result = "";
            foreach (GeneXus.Utils.GxUserType sdt in sdtcol.SdtCollection)
            {
                result += sdt.ToJSonString();
            }
            return result;
        }
    }
}

GeneXusで「External Object」を作成します。

SDTControl

GeneXusで「External Object」を編集します。

GxCsTest

GeneXusのイベントを編集します。

Event 'TEST'
	
	// C#で文字結合
	&Vartest = GxCsTest.GetString("TESTだよ!")
	MSG(&Vartest)
	
	// C#でSDTをJsonに変換
	&SDT1 = new()
	&SDT1.Id = 99
	&SDT1.Name = !"oqiita"
	&SDT1.Date= &Today
	&Vartest = GxCsTest.SdtString(&SDT1)
	MSG(&Vartest)
	
	// C#でSDTを保持 変数の初期化
	&SDTControl = new()
	
	// C#でSDTを保持 1個目のSDT
	&SDT1 = new()
	&SDT1.Id = 99
	&SDT1.Name = !"oqiita"
	&SDT1.Date= &Today
	&SDTControl.SdtAdd(&SDT1)
	
	// C#でSDTを保持 2個目のSDT
	&SDT1 = new()
	&SDT1.Id = 88
	&SDT1.Name = !"oqiita88"
	&SDT1.Date= &Today + 1
	&SDTControl.SdtAdd(&SDT1)
	
	// セットされている個数を取得
	&Num = GxCsTest.SdtCount(&SDTControl)
	MSG(&Num.ToString().Trim())
	
	// JSON文字列を結合して取得
	&Vartest = GxCsTest.SdtControlString(&SDTControl)
	MSG(&Vartest)
	
Endevent

実行結果

SDTControlに保持したSDTの数と、JSONで結合した文字列が画面に表示されれば成功です。

別のSDT

External ObjectでわざとSDTの型を設定しないでおくと別のSDTをSDTControlに設定できるところです。

Event 'TEST'
		
	// C#でSDTを保持 変数の初期化
	&SDTControl = new()
	
	// C#でSDTを保持1
	&SDT1 = new()
	&SDT1.Id = 99
	&SDT1.Name = !"oqiita"
	&SDT1.Date= &Today
	&SDTControl.SdtAdd(&SDT1)
	
	// C#でSDTを保持2
	&SDT1 = new()
	&SDT1.Id = 88
	&SDT1.Name = !"oqiita88"
	&SDT1.Date= &Today + 1
	&SDTControl.SdtAdd(&SDT1)	
	
	// 別のSDTを作成
	&SDT2.aaa = 1
	&SDT2.bbb = 2
	&SDT2.ccc = 3
	&SDTControl.SdtAdd(&SDT2)
	
	// JSON文字列を結合して取得
	&Vartest = GxCsTest.SdtControlString(&SDTControl)
	MSG(&Vartest)
	
Endevent

↑こんな感じで。
なのでまぁいろいろなことができる・・・・かも?

まとめ

何に使えるとかそんなの知りません!

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください