ArrayList型をDomainServiceクラスからCLient Sideに返す方法は?
-
06-07-2019 - |
質問
背景: Silverlight3 / C#/。Netで3〜4週間の経験があり、RIAサービスコンセプトで約3日間の価値があります。 (これまでの私の最新の質問のほとんどが理由を説明するはずです)
Silverlight3でMicrosoftのRIAサービスのテスト実装を行っています。これは、私がクライアントのためにしなければならない概念実証の一部です。とても基本的です。 RIAサービスなどを使用して、Silverlight3プロジェクトをビルドする方法を見つけました。したがって、文字列とintの受け渡しは現在のところ問題ありません。
しかし、ドメインサービスクラスからSL3クライアントにArrayListを返す必要があります。ただし、ArrayListをそのまま渡すことは許可されていないようです。また、C#についての私の限られた知識は、迅速な型キャスト/変換/その他の実行には役立ちません。このサーバー側の関数は、SL3クライアントに返す必要があるArrayListを取得します。そのため、クライアント側に送信するには、何かを行う必要があります。
質問: DomainServiceクラス関数が呼び出し元のクライアント/ SL3関数にそれを返すことを許可するために、ArrayList(c#で)に何をすべきかを誰もが知っていますか?
[注:試行の大半はすべてエラーで終了します。「myFunctionName」という名前のサービス操作が必要な署名に準拠していません。戻り値とパラメータの両方の型は、エンティティ型または事前定義されたシリアル化可能な型のいずれかでなければなりません。"]
適切と思われる情報はお気軽にお問い合わせください。 よろしくお願いします。
解決
見つかった解決策を投稿しないことに対する謝罪。ボスは私が扱える以上の仕事を私に投げました。 :) 私のソリューションは最善ではないかもしれないことに注意してください、しかしSLとRIAサービスに関する私の知識はとても新しいので、それは許されるかもしれないと思います。最初は、クライアントから提供されたコードからかなり複雑な配列を返したいと思っていましたが、労力と時間の制約により、リストを変換して返すだけでした。 これが何らかの形で役立つことを願っています。
クライアント側:MainPage.xaml.csのSilverlightコードでは、サーバー側からデータのリストを取得して、ドロップダウンリストに表示する呼び出しがあります。
// Function called on load of the SL interface
// 'slayer' is an object of the Domain Service Class server-side
// 'this.gidSessionNumber' is just a number used in the demo to represent a session
public void loadPaymentTypeComboBox()
{
InvokeOperation<IEnumerable<string>> comboList = sLayer.getPaymentTypeCombo(this.gidSessionNumber);
comboList.Completed += new EventHandler(popPaymentCombo_complete);
}//function loadAllComboBoxes
// Event handler assigned
public void popPaymentCombo_complete(object sender, EventArgs e)
{
InvokeOperation<IEnumerable<string>> obj = (InvokeOperation<IEnumerable<string>>)sender;
string[] list = obj.Value.ToArray();
// 'paymentTypeDropdown' is the name of the specific comboBox in the xaml file
paymentTypeDropdown.IsEnabled = true;
// Assign the returned arrayList as itemSource to the comboBox
paymentTypeDropdown.ItemsSource = list;
}
ドメインサービスクラスには、関連する機能があります:
[ServiceOperation]
public List<string> getPaymentTypeCombo(string gidNumber)
{
// Build objects from libraries provided by our client
SDT.Life.LifeCO.clsSystemCreator.CreateSysObjects(gidNumber);
this.lobjSys = SDT.Life.LifeCO.clsSystemCreator.GetSysObject(gidNumber);
// Rtrieve the ArrayList from the client's code
clsTextList comboList= this.lobjSys.lstPaymentType_PaymentQueue;
// Get the length of the returned list
int cnt= (int)comboList.Count();
// Create the List<string> which will be populated and returned
List<string> theList= new List<string>();
// Copy each element from the clsTextList to the List<string>
for (int i = 0; i < cnt;i++)
{
string status= comboList.Item(i).Description;
theList.Add(status);
}
// return the newly populated List<string>
return theList;
}//end function getPaymentTypeCombo
他のヒント
ArrayListを返すことができるかどうかはわかりません。代わりにIEnumerableを返して、サービスがメソッドを読み取りメソッドとして認識するようにすることを検討する必要があると思います。
ListまたはObservableCollectionがあり、それをComboBoxなどのItemControlにバインドする場合、ItemControlでItemsSourceを設定できます。 ItemControlのDisplayPathプロパティを使用して、表示するプロパティを設定するか、DataTemplateを使用します。
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text={"Binding Path=Property1"}/>
<TextBlock Text={"Binding Path=Property2"}/>
<TextBlock Text={"Binding Path=Property3"}/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>