2013-10-06 20 views
6
private const int ItemsPerRequest = 10; 
[WebMethod] 
public RadComboBoxItemData[] GetAccount(object context) 
{ 
    RadComboBoxContext obj = (RadComboBoxContext)context; 
    DataTable data = GetDataAccount(obj.Text); 

    RadComboBoxData comboData = new RadComboBoxData(); 
    int itemOffset = obj.NumberOfItems; 
    int endOffset = Math.Min(itemOffset + ItemsPerRequest, data.Rows.Count); 
    comboData.EndOfItems = endOffset == data.Rows.Count; 

    List result = new List(endOffset - itemOffset); 

    for (int i = itemOffset; i < endOffset; i++) 
    { 
     RadComboBoxItemData itemData = new RadComboBoxItemData(); 
     itemData.Value = data.Rows[i]["AccountLevelNo"].ToString(); 
     itemData.Text = data.Rows[i]["AccountDesc3"].ToString(); 
     itemData.Attributes.Add("Level6", data.Rows[i]["AccountDesc2"].ToString()); 
     itemData.Attributes.Add("Level1", data.Rows[i]["AccountDesc1"].ToString()); 

     result.Add(itemData); 
    } 

    comboData.Items = result.ToArray(); 
    // comboData.Message = GetStatusMessage(endOffset, data.Rows.Count); 

    return comboData.Items.ToArray(); 
} 

private static DataTable GetDataAccount(string text) 
{ 
    int accCode = 0; 
    string query = "select COA.LevelAccountNo,COA.AccountDesc as AccountDesc3,Level1.AccountDesc as AccountDesc1, Level2.AccountDesc as AccountDesc2 from COA COA,(select LevelAccountNo,AccountDesc " + 
     "from COA where len(LevelAccountNo)=2)as Level1,(select LevelAccountNo,AccountDesc from COA where len(LevelAccountNo)=5)as Level2 " + 
     "where Level1.LevelAccountNo=left(COA.LevelAccountNo,2)and Level2.LevelAccountNo=left(COA.LevelAccountNo,5) and len(COA.LevelAccountNo)>6"; 

    try 
    { 
     accCode = Convert.ToInt32(text); 
     query = query + " COA.LevelAccountNo like '" + text + "%'";  
    } 
    catch (Exception ex) 
    { 
     query = query + " COA.AccountDesc3 like '%" + text + "%'"; 
    } 

    SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"].ToString()); 
    // string constr=ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 

    SqlDataAdapter adapter = new SqlDataAdapter(query, con); 
    // adapter.SelectCommand.Parameters.AddWithValue("@text", text); 

    DataTable data = new DataTable(); 
    adapter.Fill(data); 
    con.Close(); 
    return data; 
} 

to jest mój kod serwis internetowyTelerik.Web.UI.RadComboBoxContext nie jest obsługiwany, ponieważ implementuje IDictionary

Collapse | Copy Code 
<telerik:RadComboBox ID="cboAccount" runat="server" Height="200" Width="200" EmptyMessage="Select an Account" 
    EnableLoadOnDemand="true" ShowMoreResultsBox="true" EnableVirtualScrolling="true"> 
    <HeaderTemplate> 
     <h3>Accounts</h3> 
    </HeaderTemplate> 
    <ClientItemTemplate> 
     <div> 
      <ul> 
       <li><span><b>Name:#= Text # </b></span></li> 
       <li><span>Level6 #= Attributes.Level6 # </span></li> 
       <li><span>Level1: #= Attributes.Level4 # </span></li> 
       <li><span>Level4 #= Attributes.Level1 # </span></li> 
      </ul> 
     </div> 
    <br></br> 
    </ClientItemTemplate> 
    <WebServiceSettings Method="GetAccount" Path="InvestmentDropDownWebService.asmx" /> 
</telerik:RadComboBox> 

Używam usługa dla pierwszego czasu w moim projekcie. Nie wiem, jak rozwiązać ten błąd. Jeśli korzystam z wersji aspx.cs, działa to idealnie i wiążą się wartości w polu kombi. Ale kiedy jestem wiążących wartości do ComboBox za pomocą usługi internetowej, jej daje błąd:

The type Telerik.Web.UI.RadComboBoxContext is not supported because it implements IDictionary.

+3

Ktoś może być w stanie odpowiedzieć, ale najlepszym miejscem na takie pytanie jest forum Telerik. – FeliceM

Odpowiedz

2

Ten problem powstać z powodu Visual Studio debugera. To z powodu jego domyślnego zachowania. Istnieje obejście tego problemu. Zmień linia

[WebMethod] 

do

[WebMethod(EnableSession = true)] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 

A także dodać atrybut z

WebServiceSettings-UseHttpGet="true" 

w kodzie ASPX z RadCombo Box.
Aby uzyskać więcej informacji dotyczących tego problemu, zobacz this question in Telerik forum.

0

Przyczyną problemu jest serializacja (xml). Pamiętaj, że mechanizm serializacji został zbudowany na samym początku platformy, ładne rzeczy jako generyczne - kolekcje/słowniki zostały dodane po. Oznacza to, że funkcjonalność, jakiej można oczekiwać od teraz, mogła nie być możliwa w początkowej fazie programowania.

Co prowadzi nas do słownika. Podstawowa klasa słownika nie obsługuje serializacji, ponieważ serializer bardzo nie lubi/obsługuje typów "nieznanych". Ponieważ słowniki mogą być "[obiektem, obiektem]", jest to niebo typu nieznanego.

Ciekawym sposobem na stworzenie problemu podobnego nieznanego typu jest następujący.

  1. Utwórz usługę sieciową, która oczekuje parametru "a" jako parametru.
  2. Utwórz odniesienie do strony internetowej dla usługi.
  3. Utwórz klasę "b", która pochodzi od "a".
  4. Teraz nazywamy WebMethod z instancją „b” jako parametr

Będziesz teraz pojawia się komunikat o błędzie, że połączenie nie powiodło się, ponieważ „Typ B było nieoczekiwane”. Mam nadzieję, że można zobaczyć, jak te dwie rzeczy (nieoczekiwany typ/Dictionary) są związane ...

Można podać tylko serializer xml typy powiedziano się spodziewać w czasie projektowania

roztworze z „sohaiby” będzie działać, ponieważ jest on mówi usługa NIE używać xml serializacji, ale do wykorzystania JSON w linii:

ResponseFormat = ResponseFormat.Json 

to wszystko zostało powiedziane, jest to naprawdę wina Telerics i powinni to naprawić.

Powiązane problemy