【问题标题】:Force UpdatePanel with datalist to refresh on database changed - SqlDependency使用 datalist 强制 UpdatePanel 在数据库更改时刷新 - SqlDependency
【发布时间】:2014-01-30 10:53:56
【问题描述】:

我正在使用 SQLDependency 来捕获数据库中的更改。 http://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3

此代码确实有效。当我在表中更改某些内容时,会触发事件。

    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
    }

BindOrderDataList 我正在设置我的数据列表的数据源。

    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();
    }

当然什么也没发生。然后我把Datalist放在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>

当我单击此Button1 时,将执行与RefreshWithSqlDependency 相同的方法(NotificationOnChanged),这正在工作... 当DataList 中的内容发生变化时,是否有任何事件会强制UpdatePanel 更新?

我已经尝试委托在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();
    }

但没有成功...

【问题讨论】:

    标签: c# asp.net refresh updatepanel sqldependency


    【解决方案1】:

    您可以尝试使用计时器控制。 这是示例:http://www.dotnetheaven.com/article/auto-refresh-data-on-page-using-ajax-in-vb.net

    希望对您有所帮助。

    【讨论】:

    • 我需要使用 SQLDependency,而不是计时器。
    【解决方案2】:

    SQLDependency 的事件不能更新更新面板的内容。您必须使用计时器等其他事件触发器来触发更新事件。如果计时器滴答作响,则 updatepanel 更新内容。将您的更新数据列表代码放入计时器事件中。我就是这样用的,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多