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 ...

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top