这里我放了我的示例代码。请更正错误。在示例代码中,我想逐个加载更新面板“UpdatePanelBodySub1”,“UpdatePanelBodySub2”,“UpdatePanelBodySub3”和“UpdatePanelBodySub4”。如果一个updatepanel加载了所有记录,然后立即显示,那么下一个updatepanel将开始工作....请帮我。 (Visual Studio 2008和Framework 3.5)
Default.aspx的
Page Main - 多个更新面板
<UsrCtrl:MainControl ID="mainControl1" runat="server" EnableViewState="true" />
</div>
</form>
Default.aspx.cs 使用系统; 使用System.Web.UI; 使用System.Web.UI.WebControls;
public partial class _Default:Page { /// /// /// /// protected override void OnPreRenderComplete(EventArgs e) { TextBox txtIsSearch =(TextBox)mainControl1.FindControl(“headerControl1”)。FindControl(“txtIsSearch”);
if (Convert.ToBoolean(txtIsSearch.Text))
{
UpdatePanel updatePanelBodySub;
updatePanelBodySub =
(UpdatePanel)
mainControl1.FindControl("bodyControl1").FindControl("bodySubControl1").FindControl(
"UpdatePanelBodySub1");
updatePanelBodySub.DataBind();
updatePanelBodySub =
(UpdatePanel)
mainControl1.FindControl("bodyControl1").FindControl("bodySubControl2").FindControl(
"UpdatePanelBodySub2");
updatePanelBodySub.DataBind();
updatePanelBodySub =
(UpdatePanel)
mainControl1.FindControl("bodyControl1").FindControl("bodySubControl3").FindControl(
"UpdatePanelBodySub3");
updatePanelBodySub.DataBind();
updatePanelBodySub =
(UpdatePanel)
mainControl1.FindControl("bodyControl1").FindControl("bodySubControl4").FindControl(
"UpdatePanelBodySub4");
updatePanelBodySub.DataBind();
txtIsSearch.Text = "false";
}
base.OnPreRenderComplete(e);
}
}
MainControl.ascx
<asp:UpdateProgress ID="UpdateProgressMain" runat="server" AssociatedUpdatePanelID="UpdatePanelMain" DisplayAfter="50">
<ProgressTemplate>
<img src="loading.gif" alt="Loading ... " title="Loading ... " />
</ProgressTemplate>
</asp:UpdateProgress>
<h1>Search data from 4 different databases</h1>
<UsrCtrl:HeaderControl ID="headerControl1" runat="server" EnableViewState="true" />
<UsrCtrl:BodyControl ID="bodyControl1" runat="server" EnableViewState="true" />
</ContentTemplate>
MainControl.ascx.cs
使用System;
public partial class MainControl:System.Web.UI.UserControl { protected void Page_Load(object sender,EventArgs e) {
}
}
HeaderControl.ascx
HeaderControl.ascx.cs
使用System; 使用System.Web.UI.WebControls;
public partial class HeaderControl:System.Web.UI.UserControl { protected void Page_Load(object sender,EventArgs e) {
}
protected void btnSearch_Click(object sender, EventArgs e)
{
TextBox txtPageNumber;
txtPageNumber =
(TextBox)
this.Parent.Parent.Parent.FindControl("bodyControl1").FindControl("bodySubControl1").FindControl(
"txtPageNumber");
// this --> ASP.hedercontrol_ascx
// this.Parent --> System.Web.UI.Control
// this.Parent.Parent --> System.Web.UI.UpdatePanel
// this.Parent.Parent.Parent --> ASP.maincontrol_ascx
txtPageNumber.Text = "1";
txtPageNumber =
(TextBox)
this.Parent.Parent.Parent.FindControl("bodyControl1").FindControl("bodySubControl2").FindControl(
"txtPageNumber");
txtPageNumber.Text = "1";
txtPageNumber =
(TextBox)
this.Parent.Parent.Parent.FindControl("bodyControl1").FindControl("bodySubControl3").FindControl(
"txtPageNumber");
txtPageNumber.Text = "1";
txtPageNumber =
(TextBox)
this.Parent.Parent.Parent.FindControl("bodyControl1").FindControl("bodySubControl4").FindControl(
"txtPageNumber");
txtPageNumber.Text = "1";
txtIsSearch.Text = "true";
}
}
BodyControl.ascx
BodyControl.ascx.cs
使用System;
public partial class BodyControl:System.Web.UI.UserControl { protected void Page_Load(object sender,EventArgs e) {
}
}
BodySubControl1.ascx
<asp:UpdateProgress ID="UpdateProgressBodySub1" runat="server" AssociatedUpdatePanelID="UpdatePanelBodySub1" DisplayAfter="50">
<ProgressTemplate>
<img src="loading.gif" alt="Loading ... " title="Loading ... " />
</ProgressTemplate>
</asp:UpdateProgress>
<h3>From database 1</h3>
<asp:GridView ID="GridViewBodySub1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Search Answer" DataField="SearchAns" />
</Columns>
</asp:GridView>
<asp:LinkButton ID="lnkPrevious" runat="server" Text="Previous"
ForeColor="Blue" onclick="lnkPrevious_Click"></asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" Text="Next" ForeColor="Blue"
onclick="lnkNext_Click"></asp:LinkButton>
<asp:TextBox ID="txtPageNumber" runat="server" Text="1" Visible="false"></asp:TextBox>
</ContentTemplate>
BodySubControl1.ascx.cs
使用System; 使用System.Collections.Generic; 使用System.Web.UI; 使用System.Web.UI.WebControls;
public partial class BodySubControl1:UserControl { protected void UpdatePanel_DataBinding(object sender,EventArgs e) { GridViewBodySub1.DataSource = GetRecords(); GridViewBodySub1.DataBind(); }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkPrevious_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
if (pageNumber > 1)
{
pageNumber -= 1;
}
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub1.DataBind();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkNext_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
pageNumber += 1;
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub1.DataBind();
}
/// <summary>
/// In actual case this function fetching record from database
/// For testing purpose I wrote like this.
/// </summary>
/// <returns></returns>
private List<SearchResult> GetRecords()
{
List<SearchResult> strList = new List<SearchResult>();
TextBox txtSearchCriteria =
(TextBox) this.Parent.Parent.Parent.Parent.FindControl("headerControl1").FindControl("txtSearchCriteria");
// this --> ASP.bodysubcontrol1_ascx
// this.Parent --> ASP.bodycontrol_ascx
// this.Parent.Parent --> System.Web.UI.Control
// this.Parent.Parent.Parent --> System.Web.UI.UpdatePanel
// this.Parent.Parent.Parent.Parent --> ASP.maincontrol_ascx
int recordNumberStart = ((Convert.ToInt32(txtPageNumber.Text) - 1) * 10) + 1;
int recordNumberEnd = recordNumberStart + 9;
for (int i = recordNumberStart; i <= recordNumberEnd; i++)
{
strList.Add(new SearchResult(string.Concat("DB1 :", txtSearchCriteria.Text.Trim(), " ", i.ToString())));
}
for (long i = 0; i < 999999999; i++)
{
// real case it will not come
}
return strList;
}
}
BodySubControl2.ascx
<asp:UpdateProgress ID="UpdateProgressBodySub2" runat="server" AssociatedUpdatePanelID="UpdatePanelBodySub2" DisplayAfter="50">
<ProgressTemplate>
<img src="loading.gif" alt="Loading ... " title="Loading ... " />
</ProgressTemplate>
</asp:UpdateProgress>
<h3>From database 2</h3>
<asp:GridView ID="GridViewBodySub2" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Search Answer" DataField="SearchAns" />
</Columns>
</asp:GridView>
<asp:LinkButton ID="lnkPrevious" runat="server" Text="Previous"
ForeColor="Blue" onclick="lnkPrevious_Click"></asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" Text="Next" ForeColor="Blue"
onclick="lnkNext_Click"></asp:LinkButton>
<asp:TextBox ID="txtPageNumber" runat="server" Text="1" Visible="false"></asp:TextBox>
</ContentTemplate>
BodySubControl2.ascx.cs
使用System; 使用System.Collections.Generic; 使用System.Web.UI; 使用System.Web.UI.WebControls;
public partial class BodySubControl2:UserControl { protected void UpdatePanel_DataBinding(object sender,EventArgs e) { GridViewBodySub2.DataSource = GetRecords(); GridViewBodySub2.DataBind(); }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkPrevious_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
if (pageNumber > 1)
{
pageNumber -= 1;
}
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub2.DataBind();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkNext_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
pageNumber += 1;
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub2.DataBind();
}
/// <summary>
/// In actual case this function fetching record from database
/// For testing purpose I wrote like this.
/// </summary>
/// <returns></returns>
private List<SearchResult> GetRecords()
{
List<SearchResult> strList = new List<SearchResult>();
TextBox txtSearchCriteria =
(TextBox)this.Parent.Parent.Parent.Parent.FindControl("headerControl1").FindControl("txtSearchCriteria");
// this --> ASP.bodysubcontrol2_ascx
// this.Parent --> ASP.bodycontrol_ascx
// this.Parent.Parent --> System.Web.UI.Control
// this.Parent.Parent.Parent --> System.Web.UI.UpdatePanel
// this.Parent.Parent.Parent.Parent --> ASP.maincontrol_ascx
int recordNumberStart = ((Convert.ToInt32(txtPageNumber.Text) - 1) * 10) + 1;
int recordNumberEnd = recordNumberStart + 9;
for (int i = recordNumberStart; i <= recordNumberEnd; i++)
{
strList.Add(new SearchResult(string.Concat("DB2 :", txtSearchCriteria.Text.Trim(), " ", i.ToString())));
}
for (long i = 0; i < 999999999; i++)
{
// real case it will not come
}
return strList;
}
}
BodySubControl3.ascx
<asp:UpdateProgress ID="UpdateProgressBodySub3" runat="server" AssociatedUpdatePanelID="UpdatePanelBodySub3" DisplayAfter="50">
<ProgressTemplate>
<img src="loading.gif" alt="Loading ... " title="Loading ... " />
</ProgressTemplate>
</asp:UpdateProgress>
<h3>From database 3</h3>
<asp:GridView ID="GridViewBodySub3" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Search Answer" DataField="SearchAns" />
</Columns>
</asp:GridView>
<asp:LinkButton ID="lnkPrevious" runat="server" Text="Previous"
ForeColor="Blue" onclick="lnkPrevious_Click"></asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" Text="Next" ForeColor="Blue"
onclick="lnkNext_Click"></asp:LinkButton>
<asp:TextBox ID="txtPageNumber" runat="server" Text="1" Visible="false"></asp:TextBox>
</ContentTemplate>
BodySubControl3.ascx.cs
使用System; 使用System.Collections.Generic; 使用System.Web.UI; 使用System.Web.UI.WebControls;
public partial class BodySubControl3:UserControl { protected void UpdatePanel_DataBinding(object sender,EventArgs e) { GridViewBodySub3.DataSource = GetRecords(); GridViewBodySub3.DataBind(); }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkPrevious_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
if (pageNumber > 1)
{
pageNumber -= 1;
}
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub3.DataBind();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkNext_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
pageNumber += 1;
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub3.DataBind();
}
/// <summary>
/// In actual case this function fetching record from database
/// For testing purpose I wrote like this.
/// </summary>
/// <returns></returns>
private List<SearchResult> GetRecords()
{
List<SearchResult> strList = new List<SearchResult>();
TextBox txtSearchCriteria =
(TextBox)this.Parent.Parent.Parent.Parent.FindControl("headerControl1").FindControl("txtSearchCriteria");
// this --> ASP.bodysubcontrol3_ascx
// this.Parent --> ASP.bodycontrol_ascx
// this.Parent.Parent --> System.Web.UI.Control
// this.Parent.Parent.Parent --> System.Web.UI.UpdatePanel
// this.Parent.Parent.Parent.Parent --> ASP.maincontrol_ascx
int recordNumberStart = ((Convert.ToInt32(txtPageNumber.Text) - 1) * 10) + 1;
int recordNumberEnd = recordNumberStart + 9;
for (int i = recordNumberStart; i <= recordNumberEnd; i++)
{
strList.Add(new SearchResult(string.Concat("DB3 :", txtSearchCriteria.Text.Trim(), " ", i.ToString())));
}
for (long i = 0; i < 999999999; i++)
{
// real case it will not come
}
return strList;
}
}
BodySubControl4.ascx
<asp:UpdateProgress ID="UpdateProgressBodySub4" runat="server" AssociatedUpdatePanelID="UpdatePanelBodySub4" DisplayAfter="50">
<ProgressTemplate>
<img src="loading.gif" alt="Loading ... " title="Loading ... " />
</ProgressTemplate>
</asp:UpdateProgress>
<h3>From database 4</h3>
<asp:GridView ID="GridViewBodySub4" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="Search Answer" DataField="SearchAns" />
</Columns>
</asp:GridView>
<asp:LinkButton ID="lnkPrevious" runat="server" Text="Previous"
ForeColor="Blue" onclick="lnkPrevious_Click"></asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" Text="Next" ForeColor="Blue"
onclick="lnkNext_Click"></asp:LinkButton>
<asp:TextBox ID="txtPageNumber" runat="server" Text="1" Visible="false"></asp:TextBox>
</ContentTemplate>
BodySubControl4.ascx.cs
使用System; 使用System.Collections.Generic; 使用System.Web.UI; 使用System.Web.UI.WebControls;
public partial class BodySubControl4:UserControl { protected void UpdatePanel_DataBinding(object sender,EventArgs e) { GridViewBodySub4.DataSource = GetRecords(); GridViewBodySub4.DataBind(); }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkPrevious_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
if (pageNumber > 1)
{
pageNumber -= 1;
}
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub4.DataBind();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lnkNext_Click(object sender, EventArgs e)
{
int pageNumber = Convert.ToInt32(txtPageNumber.Text);
pageNumber += 1;
txtPageNumber.Text = Convert.ToString(pageNumber);
UpdatePanelBodySub4.DataBind();
}
/// <summary>
/// In actual case this function fetching record from database
/// For testing purpose I wrote like this.
/// </summary>
/// <returns></returns>
private List<SearchResult> GetRecords()
{
List<SearchResult> strList = new List<SearchResult>();
TextBox txtSearchCriteria =
(TextBox)this.Parent.Parent.Parent.Parent.FindControl("headerControl1").FindControl("txtSearchCriteria");
// this --> ASP.bodysubcontrol4_ascx
// this.Parent --> ASP.bodycontrol_ascx
// this.Parent.Parent --> System.Web.UI.Control
// this.Parent.Parent.Parent --> System.Web.UI.UpdatePanel
// this.Parent.Parent.Parent.Parent --> ASP.maincontrol_ascx
int recordNumberStart = ((Convert.ToInt32(txtPageNumber.Text) - 1) * 10) + 1;
int recordNumberEnd = recordNumberStart + 9;
for (int i = recordNumberStart; i <= recordNumberEnd; i++)
{
strList.Add(new SearchResult(string.Concat("DB4 :", txtSearchCriteria.Text.Trim(), " ", i.ToString())));
}
for (long i = 0; i < 999999999; i++)
{
// real case it will not come
}
return strList;
}
}
SearchResult.cs
/// /// SearchResult的摘要描述 /// 公共类SearchResult { /// ///私有变量 /// 私有字符串_SearchAns;
/// <summary>
/// Property
/// </summary>
public string SearchAns
{
get
{
return _SearchAns;
}
set
{
_SearchAns = value;
}
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="CurrentSeachAns"></param>
public SearchResult(string CurrentSeachAns)
{
_SearchAns = CurrentSeachAns;
}
}
的web.config
Visual Studio中的Asp.Net配置选项。 可以在中找到完整的设置和注释列表 machine.config.comments通常位于 \的Windows \ Microsoft.Net \框架\ V2.X \配置 - &GT; 部分启用配置 安全认证方式使用的 ASP.NET识别传入的用户。 - &GT; 部分启用配置 如果/当发生未处理的错误时该怎么办 在执行请求期间。特别, 它使开发人员能够配置html错误页面 显示以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compile
答案 0 :(得分:0)
这是否必须是更新面板?如果是我,我会使用jQuery和(理想情况下)MVC;然后它很简单,如:
$('#div1').load(url1, function() {
$('#div2').load(url2, function() {
$('#div3').load(url3, function() {
$('#div4').load(url4);
});
});
});
即。我们使用每个回调来开始下一个div加载,但将每个div视为不相关的请求。