【发布时间】:2018-05-06 01:19:00
【问题描述】:
我有网络控件(仪表),我根据页面加载时的作业设置动态创建 1 到 x(最多 30 个)。 SignalR Hub 代码位于每 20 秒触发一次的计时器上。这样,我的动态仪表每 30 秒获取一次数据。我正在使用客户端 javascript 函数 guage.set_vale() 设置控件的值。当集线器触发并设置值时,此函数每 30 秒循环一次。
For i As Integer = 0 To 7
Dim UserControl As WebUserControl1 = CType(Me.LoadControl("~/WebUserControl1.ascx"), WebUserControl1)
UserControl.ID = "RG" & (i) ''1_RadGauge
UserControl.ControlWidth = 9
UserControl.setTankNumber = i + 20
Me.Panel1.Controls.Add(UserControl)
Next
目前,所有控件都从同一个 HUB 获取数据。为这些控件提供数据的是服务器端的 SQL 数据库。
SELECT top(1) * from zSignalR_DB_Test order by id desc
所以所有控件都显示相同的数据。 我想要做的是让每个控件显示其数据。所以每个控件都会从数据库中获取自己的数据
SELECT top(1) * from zSignalR_DB_Test WHERE ID = 'MyControlID' order by id desc
我查看了 SignalR Groups,但还没有看到如何做我想做的事情。这样,我需要做的就是将 controlID 与数据库中的数据关联起来。
我的问题是:
我是否需要为我动态创建的每个控件使用单独的 SignalR Hub?
我需要动态创建这些集线器吗?
SignalR Groups 是正确的做法吗?
如果我只每 30 秒或一分钟更新一次,我是否可以不只是创建一个从客户端发回 ID 的方法,并且当我循环遍历客户端中的每个控件时(可能添加 1 秒的暂停)发送 ID运行不同的 SQL 语句?
任何想法或例子都会很棒。
更多代码:
<script type="text/javascript">
$(function() {
var logger = $.connection.loghub;
logger.client.logMessage = function(msg) {
var ajaxPanel = document.getElementById("Panel1");
for (var x = 0; x < ajaxPanel.children.length; x=x+2) {
if (msg <=50){
var ImageElementGreen = ajaxPanel.children[x].children[0];
ImageElementGreen.style.visibility = 'visible'
var ImageElementRed = ajaxPanel.children[x].children[1];
ImageElementRed.style.visibility = 'hidden'
} else {
var ImageElementGreen = ajaxPanel.children[x].children[0];
ImageElementGreen.style.visibility = 'hidden'
var ImageElementRed = ajaxPanel.children[x].children[1];
ImageElementRed.style.visibility = 'visible'
}
var TBValueElement = ajaxPanel.children[x].children[3].children[0];
var TBValue = $find(TBValueElement.id);
TBValue.set_value(msg + "%");
var linearGaugeElement = ajaxPanel.children[x].children[4];
var linearGauge = $find(linearGaugeElement.id);
linearGauge.set_value(msg);
}
};
$.connection.hub.start();
});
</script>
【问题讨论】: