Telerik RadGrid привязан к веб-сервису без Linq

Я хочу привязать Telerik RadGrid к веб-службе без использования Linq. Во всех примерах, которые я могу найти, веб-служба должна возвращать список (из MyObject); Я пробовал это, и это прекрасно работает. Однако таблица, к которой я привязываюсь, может во время выполнения иметь дополнительные столбцы или столбцы могут иметь другой тип данных, поэтому я не могу использовать статический класс MyObject для представления таблицы во время компиляции. Я также не знаю во время компиляции, какие столбцы должны отображаться в сетке. Я хотел бы привязаться к веб-службе по соображениям производительности.

Я пытался заставить метод веб-службы возвращать DataView и использовать его разными способами, но он не работает. Как мне написать метод GetData/GetDataAndCount веб-службы для возврата данных из DataView или другого источника данных, отличного от linq?

Спасибо.


person Alfred    schedule 22.09.2010    source источник


Ответы (1)


Вы можете сериализовать DataTable аналогично моему сообщению в блоге. Вот пример:

    <telerik:RadGrid ID="RadGrid1" AllowPaging="true" runat="server">
        <MasterTableView>
            <Columns>
                <telerik:GridBoundColumn DataField="CustomerID" HeaderText="ID" />
                <telerik:GridBoundColumn DataField="CompanyName" HeaderText="Name" />
                <telerik:GridBoundColumn DataField="ContactName" HeaderText="Contact" />
                <telerik:GridBoundColumn DataField="Country" HeaderText="Country" />
                <telerik:GridBoundColumn DataField="City" HeaderText="City" />
            </Columns>
        </MasterTableView>
        <PagerStyle AlwaysVisible="true" />
        <ClientSettings>
            <DataBinding Location="WebService.asmx" SelectMethod="GetDataAndCount" />
        </ClientSettings>
    </telerik:RadGrid>

    <%@ WebService Language="C#" Class="WebService" %>

using System.Data;
using System.Linq;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    public Telerik.Web.UI.GridBindingData GetDataAndCount(int startRowIndex, int maximumRows)
    {
        var table = GetDataTable("select * from customers");

        var columns = table.Columns.Cast<System.Data.DataColumn>();

        var data = table.AsEnumerable()
            .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] })
            .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null))
            .Skip(startRowIndex).Take(maximumRows)
            .ToList<object>();

        return new Telerik.Web.UI.GridBindingData() { Data = data, Count = table.Rows.Count };
    }

    public System.Data.DataTable GetDataTable(string query)
    {
        var connString = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
        var conn = new System.Data.SqlClient.SqlConnection(connString);
        var adapter = new System.Data.SqlClient.SqlDataAdapter();
        adapter.SelectCommand = new System.Data.SqlClient.SqlCommand(query, conn);

        var table = new System.Data.DataTable();

        conn.Open();
        try
        {
            adapter.Fill(table);
        }
        finally
        {
            conn.Close();
        }

        return table;
    }
}
person Vladimir Enchev    schedule 27.09.2010