2014-01-11 50 views
0

我正在使用SQLDependency捕獲數據庫中的更改。 http://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3用數據列強制UpdatePanel刷新數據庫已更改 - SqlDependency

此代碼確實有效。當我在表格中改變某些事物時,事件被解僱。

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我正在設置我的datalist的數據源。

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> 

當作爲RefreshWithSqlDependency執行(NotificationOnChanged)我點擊這個Button1同樣的方法,這是工作...... 是否存在,這將迫使UpdatePanelDataList變化來更新內容時,無論如何?

我已經嘗試過委託在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(); 
    } 

,但沒有成功......

回答

0

SQLDependency的事件無法更新updatepanel的內容。您必須使用其他事件觸發器(如計時器)來觸發更新事件。如果計時器滴答,則updatepanel會更新內容。把你的更新數據代碼放入定時器事件中。我正在使用,它的工作原理。

相關問題