2009-10-23 44 views
1

背景:在Silverlight3/C#/ .Net和3-4天左右的RIA Services概念價值。 (我以前的大多數問題都應該解釋爲什麼)如何將ArrayList類型從DomainService類返回到CLient端?

我正在使用Silverlight3測試Microsoft的RIA服務。這是我必須爲客戶做的一個概念證明的一部分。所以它非常基本。 我已經想出瞭如何使用RIA服務等構建Silverlight3項目。因此,傳遞和返回字符串和int是目前沒有問題。

但我需要從我的域服務類返回一個ArrayList到我的SL3客戶端。但它似乎傳回ArrayList是不允許的。而且我對C#的有限知識不能幫助我們做快速類型轉換/轉換/等等。這個服務器端函數得到一個ArrayList,它必須返回到SL3客戶端,所以我必須做一些事情來發送它到客戶端。

問: 有誰知道什麼應該做一個ArrayList(在C#)允許的DomainService類函數將其返回到調用客戶端/ SL3功能?

[注:我的大多數嘗試都最終在錯誤的:「命名的服務操作‘myFunctionName’不符合所需的簽名都返回和參數類型必須爲實體類型或預定義之一。可序列化的類型。「]

請隨時要求任何您認爲合適的信息。 預先感謝您。

回答

2

我很抱歉沒有發佈我找到的解決方案。老闆向我投入的工作比我能處理的要多。 :) 請注意我的解決方案可能不是最好的,但由於我在SL和RIA服務方面的知識是如此的新,我想這可能是一種理由。最初我想從客戶端提供的代碼中傳回相當複雜的數組,但是努力和時間限制讓我只能正確地轉換並返回List。 希望這有助於某種方式。

客戶端:MainPage.xaml.cs中的Silverlight代碼我有一個調用來從服務器端檢索數據列表,以顯示在dropDown列表中。

// 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 

+0

感謝Logansama的解決方案:D我搜索了整個互聯網,謝謝你:D你真棒! – 2011-02-15 20:51:38

1

不確定您是否可以返回ArrayList。我猜你應該考慮返回一個IEnumerable,它會使服務將該方法識別爲Read方法。

如果您有一個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> 
+0

謝謝。我設法返回一個列表項目,這似乎工作。但是現在我正在進行一次新的旅程,以查找如何讓這些數據顯示在組合框中,或者正如他們所說將數據綁定到組合框。 – ddtpoison777 2009-10-30 14:10:34