Forza UpdatePanel con Datatalist da aggiornare sul database modificato - SQLDependency
-
26-12-2019 - |
Domanda
Sto usando SQLDependency per catturare le modifiche nel mio database. http://code.msdn.microsoft.com/how-touse-Sqldependency-5C0Da0b3
Questo codice funziona davvero.Quando sto cambiando qualcosa nella tabella, l'evento è sparato.
private void RefreshWithSqlDependency()
{
iquery = from order in context.Order
where order.Client.Nickname==nickName && order.StatusId!=5
select new { Id = order.Id, Description = order.Description, OrderStatus = order.Status.Name };
notification = new ImmediateNotificationRegister<Order>(context, iquery);
notification.OnChanged += NotificationOnChanged;
}
protected void NotificationOnChanged(object sender, EventArgs e)
{
BindOrderDataList(); //this is executed
}
.
In BindOrderDataList
sto impostando il dataSource del mio datatalista.
private void BindOrderDataList()
{
DataListOrders.DataSource = context.Order.Where(x => x.Client.Nickname == nickName && x.StatusId != 5)
.Select(x => new { Id = x.Id, Description = x.Description, OrderStatus = x.Status.Name }).ToList();
DataListOrders.DataBind();
}
.
ovviamente non è successo nulla.Quindi metto Datalist
all'interno di UpdatePanel
.
<asp:UpdatePanel ID="UpdatePanelOrdersList" runat="server" UpdateMode="Conditional" OnLoad="UpdatePanelOrdersList_Load">
<ContentTemplate>
<asp:DataList ID="DataListOrders" runat="server" RepeatDirection="Horizontal" RepeatColumns="5" OnItemDataBound="DataListOrders_ItemDataBound"
CellPadding="5" Width="100%" OnItemCommand="DataListOrders_ItemCommand" EnableViewState="False">
<ItemStyle Wrap="True" HorizontalAlign="Center" VerticalAlign="Top"></ItemStyle>
<ItemTemplate>
<asp:Panel ID="Order" runat="server">
<div style="padding: 3px; border: 3px solid; border-color: #F0F0F0">
<h4>Order
<asp:Label ID="OrderId" runat="server" Text='<%# Eval("Id") %>'></asp:Label></h4>
<h5>Desc:
<asp:Label ID="Description" runat="server" Text='<%# Eval("Description") %>'></asp:Label></h5>
<h5>Status:
<asp:Label ID="OrderStatus" runat="server" Text='<%# Eval("OrderStatus") %>'></asp:Label></h5>
<br />
<asp:DataList ID="DataListOrderProducts" runat="server" RepeatDirection="Vertical" RepeatColumns="1"
OnItemDataBound="DataListOrderProducts_ItemDataBound" OnItemCommand="DataListOrderProducts_ItemCommand"
EnableViewState="False">
<ItemStyle Wrap="True"></ItemStyle>
<ItemTemplate>
<asp:Panel ID="OrderItem" runat="server">
<h6>Product:
<asp:Label ID="OrderProductId" runat="server" Text='<%# Eval("LineId") %>' CssClass="hiddencol"></asp:Label></h6>
<h6>Product:
<asp:Label ID="Product" runat="server" Text='<%# Eval("ProductName") %>'></asp:Label></h6>
<h6>Status:
<asp:Label ID="ProductStatus" runat="server" Text='<%# Eval("ProductStatus") %>'></asp:Label></h6>
<asp:LinkButton ID="ItemSubmit" runat="server" CommandName="ItemCompleted" Text="Complete" Visible="False" />
</asp:Panel>
</ItemTemplate>
</asp:DataList>
<asp:LinkButton ID="OrderSubmit" runat="server" CommandName="OrderCompleted" Text="Complete" Visible="false" />
</div>
</asp:Panel>
</ItemTemplate>
</asp:DataList>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="NotificationOnChanged" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DataListOrders" EventName="DataBinding" />
<asp:AsyncPostBackTrigger ControlID="DataListOrders" />
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
.
Quando sto facendo clic su questo Button1
stesso metodo come in RefreshWithSqlDependency
viene eseguito (NotificationOnChanged
) e questo funziona ...
C'è qualche evento che costringerebbe UpdatePanel
ad aggiornare quando i contenuti in DataList
cambiano?
Ho già provato Delegato per aumentare l'evento di aggiornamento in UpdatePanel
...
protected void NotificationOnChanged(object sender, EventArgs e)
{
BindOrderDataList();
LongTimeTask_Delegate d = new LongTimeTask_Delegate(LongTimeTask);
IAsyncResult r = d.BeginInvoke("String", new AsyncCallback(TaskCompleted), null);
d.EndInvoke(r);
}
public delegate void LongTimeTask_Delegate(string str);
public void LongTimeTask(string str)
{
Thread.Sleep(50);
}
public void TaskCompleted(IAsyncResult r)
{
UpdatePanelOrdersList.Update();
}
.
Ma nessun successo ...
Soluzione
Gli eventi di SQLDependency non possono aggiornare il contenuto dell'AggiornamentoPanel.Devi innescare l'evento di aggiornamento con altri trigger di eventi come il timer.Se TIMER TELLE TELO, AggiornaPanel Aggiorna i contenuti.Metti il tuo codice Datatalist di aggiornamento in evento timer.Sto usando così e funziona.
Altri suggerimenti
È possibile provare a utilizzare il controllo del timer. Ecco il campione: http://www.dotnetheaven.com/article/auto-refresh-data-on-page-USH-AKAX-IN-VB.net
Spero che questo aiuto.