【问题标题】:Signalr and DevexpressSignalr 和 Devexpress
【发布时间】:2017-06-18 09:25:21
【问题描述】:

我想创建一个网格并在数据库中的数据更改时自动更新它。它适用于简单的表格控件。

public partial class index : System.Web.UI.Page
{
    static string connectionString = @"Data Source=*******;initial catalog=Test;persist security info=True;  Integrated Security=SSPI;";

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    public static IEnumerable<Person> GetData()
    {
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand command = new SqlCommand(@"SELECT [Id],[Name] FROM  [dbo].[Persons]", connection))
            {

                command.Notification = null;
                SqlDependency.Start(connectionString);
                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                using (var reader = command.ExecuteReader())
                    return reader.Cast<IDataRecord>()
                        .Select(x => new Person(x.GetInt32(0), x.GetString(1))).ToList();
            }
        }
    }

    private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        MyHub.Show();
    }

    public void FillGrid()
    {
        List<Person> persons = new List<Person>();
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand command = new SqlCommand(@"SELECT [Id],[Name] FROM  [dbo].[Persons]", connection))
            {

                if (connection.State == ConnectionState.Closed)
                    connection.Open();

                using (SqlDataReader rdr = command.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        var id = rdr.GetInt32(0);
                        var name = rdr.GetString(1);
                        persons.Add(new Person(id, name));
                    }
                }
            }
        }
        grid.DataSource = persons;
        grid.DataBind();
    }
}

public class MyHub : Hub
{
    public static void Show()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.All.displayStatus();
    }
} 

还有 apsx 页面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.6.4.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.2.min.js"></script>
 <script src="signalr/hubs"></script>
<script type="text/javascript">

    $(function () {

        // Proxy created on the fly
        var job = $.connection.myHub;

        // Declare a function on the job hub so the server can invoke it
        job.client.displayStatus = function () {
            getData();
        };

        // Start the connection
        $.connection.hub.start();
        getData();

    });
    function getData()
    {           
        var $tbl = $('#tbl');
        $.ajax({
            url: '/index.aspx/GetData',
            contentType: 'application/json;charset=utf-8',
            datatype: 'json',
            type: 'POST',     
            success: function (data) {
                if (data.d.length > 0) {

                    var newdata = data.d;
                    $tbl.empty();
                    $tbl.append(' <tr><th>ID</th><th>Name</th></tr>');
                    var rows = [];
                    for (var i = 0; i < newdata.length; i++) {
                        rows.push(' <tr><td>' + newdata[i].Id + '</td><td>' + newdata[i].Name + '</td><td></tr>');
                    }
                    $tbl.append(rows.join(''));                      
                }
            }
        });          
    }

</script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table id="tbl"></table>
            <dx:ASPxGridView ID="grid" runat="server"></dx:ASPxGridView>
        </div>
    </form>
</body>
</html>

但是我想使用 Devepress Aspxgridview。 Devexpress 站点声明他们不支持 SignalR。然而,由于 Javascript 函数是在数据库中的数据更改时触发的,是否有可能以某种方式强制客户端从服务器获取数据?强制回发和/或调用 FillGrid 方法? (从 js 创建网格是不可能的,因为 AspxgridView 控件要复杂得多)。

来源:https://www.youtube.com/watch?v=30m-7wpmbrc

【问题讨论】:

    标签: devexpress signalr


    【解决方案1】:

    虽然 SignalR 不支持开箱即用,但应该可以使用现有 API 手动通知服务器端有关更新。您可以使用ASPxClientGridView.PerformCallback方法向服务器发送回调,并处理服务器端ASPxGridView.CustomCallback事件以从SQL服务器重新加载数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多