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;
}

这是我的网络服务代码

 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>

我在我的项目中第一次使用 web 服务。我不知道如何解决这个错误。如果我正在运行,aspx.cs这是完美的运行,并且值绑定在组合框中。但是,当我使用 Web 服务将值绑定到组合框时,它会给出一个错误:

不支持 Telerik.Web.UI.RadComboBoxContext 类型,因为它实现了 IDictionary。

4

2 回答 2

2

此问题是由 Visual Studio 调试器引起的。这是因为它的默认行为。有一个解决方法。改变你的线路

[WebMethod]

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

而且,添加一个属性

WebServiceSettings-UseHttpGet="true"

在 RadCombo Box 的 ASPX 代码中。
有关此问题的更多详细信息,请参阅Telerik 论坛中的此问题

于 2013-10-08T07:41:56.910 回答
0

问题的原因是(xml)序列化。请记住,序列化机制是在平台开始时构建的,之后添加了通用集合/字典等好东西。这意味着您希望现在可以使用的功能在最初的开发过程中可能无法实现。

这将我们带到了字典中。字典的基类不支持序列化,因为序列化器不太喜欢/处理“未知”类型。由于字典可以是'[object, object]',它是未知类型的天堂。

创建类似的未知类型问题的一种有趣方法如下。

  1. 创建一个期望类 'a' 作为参数的 web 服务。
  2. 创建对服务的 Web 引用。
  3. 创建派生自“a”的类“b”。
  4. 现在以“b”的实例作为参数调用 web 方法

您现在将收到一条错误消息,指出调用失败,因为“类型 b 是意外的”。我希望你能看到这两件事(意外的类型/字典)是如何相关的......

您只能为 xml 序列化程序提供它在设计时被告知期望的类型

'sohaiby' 的解决方案将起作用,因为他告诉 web 服务不要使用 xml 序列化,而是在行中使用 JSON:

ResponseFormat = ResponseFormat.Json

话虽如此,这确实是 Telerics 的错误,他们应该修复它。

于 2015-04-15T17:33:38.770 回答