P
Phillip Ian
Tried this over in CSharp.General and didn't get anything, so I
thought I'd try again here. If there's an AJAX specific group I could
ask this in, please let me know...I did look.
I'm trying to code what I think is a fairly typical Master/Detail
scenario with two GridViews, using AJAX. Using the Northwind sample,
I have two ObjectDataSources - one which pulls data from the Orders
table, and one that pulls the related data from [Order Details].
Each
has a GridView, each on its own UpdatePanel.
According to timestamps I put on each update panel and the main page,
everything works as it should. The proper panels get refresh for
each
operation (selecting, paging, sorting on the Master GridView). So
why
am I bothering you if it works?
I coded a two second thread.sleep in the Details GridView's
ObjectDataSource to simulate heavy processing latency. Paging and
sorting the Master GridView work as expected - no sleeping - UNTIL I
select a record to show the detail. Once a record is selected, the
[Order Details] _Selecting method fires with every refresh, whether
or
not a new record is selected.
The [Order Details] update panel does NOT refresh, but for some
reason
it is still calling the _Selecting method for the ObjectDataSource.
I've tried moving the ObjectDataSource inside the details update
panel
with no luck.
It doesn't seem like what I'm doing is very atypical. Am I missing
something obvious? Here's the code for the page in question:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:ObjectDataSource ID="dsOrders" runat="server"
DeleteMethod="Delete" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetOrderList"
TypeName="dsOrdersTableAdapters.taOrderList"
UpdateMethod="Update">
<DeleteParameters>
<asparameter Name="Original_OrderID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asparameter Name="CustomerID" Type="String" />
<asparameter Name="EmployeeID" Type="Int32" />
<asparameter Name="OrderDate" Type="DateTime" />
<asparameter Name="RequiredDate" Type="DateTime" />
<asparameter Name="ShippedDate" Type="DateTime" />
<asparameter Name="ShipVia" Type="Int32" />
<asparameter Name="Freight" Type="Decimal" />
<asparameter Name="ShipName" Type="String" />
<asparameter Name="ShipAddress" Type="String" />
<asparameter Name="ShipCity" Type="String" />
<asparameter Name="ShipRegion" Type="String" />
<asparameter Name="ShipPostalCode" Type="String" />
<asparameter Name="ShipCountry" Type="String" />
<asparameter Name="Original_OrderID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asparameter Name="CustomerID" Type="String" />
<asparameter Name="EmployeeID" Type="Int32" />
<asparameter Name="OrderDate" Type="DateTime" />
<asparameter Name="RequiredDate" Type="DateTime" />
<asparameter Name="ShippedDate" Type="DateTime" />
<asparameter Name="ShipVia" Type="Int32" />
<asparameter Name="Freight" Type="Decimal" />
<asparameter Name="ShipName" Type="String" />
<asparameter Name="ShipAddress" Type="String" />
<asparameter Name="ShipCity" Type="String" />
<asparameter Name="ShipRegion" Type="String" />
<asparameter Name="ShipPostalCode" Type="String" />
<asparameter Name="ShipCountry" Type="String" />
</InsertParameters>
</asp:ObjectDataSource>
<asp:Label ID="lblPageTime" runat="server" Text="Label"></
asp:Label>
<asp:UpdatePanel ID="UpdatePanel2" runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lblMasterTime" runat="server"
Text="Label"></
asp:Label>
<asp:GridView ID="GridView1" runat="server"
AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="OrderID"
DataSourceID="dsOrders">
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="Order
ID" InsertVisible="False" ReadOnly="True"
SortExpression="OrderID">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="CompanyName"
HeaderText="Customer" SortExpression="CompanyName">
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:BoundField DataField="OrderDate"
DataFormatString="{0:d}" HeaderText="Date Ordered"
HtmlEncode="False" ReadOnly="True"
SortExpression="OrderDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="RequiredDate"
DataFormatString="{0:d}" HeaderText="Date Required"
HtmlEncode="False" SortExpression="RequiredDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="ShippedDate"
DataFormatString="{0:d}" HeaderText="Date Shipped"
HtmlEncode="False" SortExpression="ShippedDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:CommandField SelectText="View Details"
ShowSelectButton="True" />
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<asp:ObjectDataSource ID="dsOrderDetails" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetOrderDetailsList"
TypeName="dsOrdersTableAdapters.taOrderDetails"
OnSelecting="dsOrderDetails_Selecting">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1"
Name="OrderID" PropertyName="SelectedValue" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:Label ID="lblChildTime" runat="server" Text="Label"></
asp:Label>
<asp:GridView ID="GridView2" runat="server"
AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID"
DataSourceID="dsOrderDetails">
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice"
HeaderText="UnitPrice" SortExpression="UnitPrice" />
<asp:BoundField DataField="Quantity"
HeaderText="Quantity" SortExpression="Quantity" />
<asp:BoundField DataField="Discount"
HeaderText="Discount" SortExpression="Discount" />
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="GridView1"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/
Default.aspx">View without AJAX</asp:HyperLink>
</div>
</form>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default2 : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
lblPageTime.Text = DateTime.Now.ToLongTimeString();
lblMasterTime.Text = DateTime.Now.ToLongTimeString();
lblChildTime.Text = DateTime.Now.ToLongTimeString();
}
protected void dsOrderDetails_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e) {
System.Threading.Thread.Sleep(2000);
}
}
thought I'd try again here. If there's an AJAX specific group I could
ask this in, please let me know...I did look.
I'm trying to code what I think is a fairly typical Master/Detail
scenario with two GridViews, using AJAX. Using the Northwind sample,
I have two ObjectDataSources - one which pulls data from the Orders
table, and one that pulls the related data from [Order Details].
Each
has a GridView, each on its own UpdatePanel.
According to timestamps I put on each update panel and the main page,
everything works as it should. The proper panels get refresh for
each
operation (selecting, paging, sorting on the Master GridView). So
why
am I bothering you if it works?
I coded a two second thread.sleep in the Details GridView's
ObjectDataSource to simulate heavy processing latency. Paging and
sorting the Master GridView work as expected - no sleeping - UNTIL I
select a record to show the detail. Once a record is selected, the
[Order Details] _Selecting method fires with every refresh, whether
or
not a new record is selected.
The [Order Details] update panel does NOT refresh, but for some
reason
it is still calling the _Selecting method for the ObjectDataSource.
I've tried moving the ObjectDataSource inside the details update
panel
with no luck.
It doesn't seem like what I'm doing is very atypical. Am I missing
something obvious? Here's the code for the page in question:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:ObjectDataSource ID="dsOrders" runat="server"
DeleteMethod="Delete" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetOrderList"
TypeName="dsOrdersTableAdapters.taOrderList"
UpdateMethod="Update">
<DeleteParameters>
<asparameter Name="Original_OrderID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asparameter Name="CustomerID" Type="String" />
<asparameter Name="EmployeeID" Type="Int32" />
<asparameter Name="OrderDate" Type="DateTime" />
<asparameter Name="RequiredDate" Type="DateTime" />
<asparameter Name="ShippedDate" Type="DateTime" />
<asparameter Name="ShipVia" Type="Int32" />
<asparameter Name="Freight" Type="Decimal" />
<asparameter Name="ShipName" Type="String" />
<asparameter Name="ShipAddress" Type="String" />
<asparameter Name="ShipCity" Type="String" />
<asparameter Name="ShipRegion" Type="String" />
<asparameter Name="ShipPostalCode" Type="String" />
<asparameter Name="ShipCountry" Type="String" />
<asparameter Name="Original_OrderID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asparameter Name="CustomerID" Type="String" />
<asparameter Name="EmployeeID" Type="Int32" />
<asparameter Name="OrderDate" Type="DateTime" />
<asparameter Name="RequiredDate" Type="DateTime" />
<asparameter Name="ShippedDate" Type="DateTime" />
<asparameter Name="ShipVia" Type="Int32" />
<asparameter Name="Freight" Type="Decimal" />
<asparameter Name="ShipName" Type="String" />
<asparameter Name="ShipAddress" Type="String" />
<asparameter Name="ShipCity" Type="String" />
<asparameter Name="ShipRegion" Type="String" />
<asparameter Name="ShipPostalCode" Type="String" />
<asparameter Name="ShipCountry" Type="String" />
</InsertParameters>
</asp:ObjectDataSource>
<asp:Label ID="lblPageTime" runat="server" Text="Label"></
asp:Label>
<asp:UpdatePanel ID="UpdatePanel2" runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lblMasterTime" runat="server"
Text="Label"></
asp:Label>
<asp:GridView ID="GridView1" runat="server"
AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="OrderID"
DataSourceID="dsOrders">
<Columns>
<asp:BoundField DataField="OrderID" HeaderText="Order
ID" InsertVisible="False" ReadOnly="True"
SortExpression="OrderID">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="CompanyName"
HeaderText="Customer" SortExpression="CompanyName">
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:BoundField DataField="OrderDate"
DataFormatString="{0:d}" HeaderText="Date Ordered"
HtmlEncode="False" ReadOnly="True"
SortExpression="OrderDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="RequiredDate"
DataFormatString="{0:d}" HeaderText="Date Required"
HtmlEncode="False" SortExpression="RequiredDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:BoundField DataField="ShippedDate"
DataFormatString="{0:d}" HeaderText="Date Shipped"
HtmlEncode="False" SortExpression="ShippedDate">
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
<asp:CommandField SelectText="View Details"
ShowSelectButton="True" />
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="Conditional">
<ContentTemplate>
<asp:ObjectDataSource ID="dsOrderDetails" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetOrderDetailsList"
TypeName="dsOrdersTableAdapters.taOrderDetails"
OnSelecting="dsOrderDetails_Selecting">
<SelectParameters>
<asp:ControlParameter ControlID="GridView1"
Name="OrderID" PropertyName="SelectedValue" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:Label ID="lblChildTime" runat="server" Text="Label"></
asp:Label>
<asp:GridView ID="GridView2" runat="server"
AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID"
DataSourceID="dsOrderDetails">
<Columns>
<asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice"
HeaderText="UnitPrice" SortExpression="UnitPrice" />
<asp:BoundField DataField="Quantity"
HeaderText="Quantity" SortExpression="Quantity" />
<asp:BoundField DataField="Discount"
HeaderText="Discount" SortExpression="Discount" />
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="GridView1"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/
Default.aspx">View without AJAX</asp:HyperLink>
</div>
</form>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default2 : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
lblPageTime.Text = DateTime.Now.ToLongTimeString();
lblMasterTime.Text = DateTime.Now.ToLongTimeString();
lblChildTime.Text = DateTime.Now.ToLongTimeString();
}
protected void dsOrderDetails_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e) {
System.Threading.Thread.Sleep(2000);
}
}