Здесь я положил свой пример кода. Пожалуйста, исправьте ошибку. В примере кода я хочу загрузить панели обновления «UpdatePanelBodySub1», «UpdatePanelBodySub2», «UpdatePanelBodySub3» и «UpdatePanelBodySub4» по одной. Если одна панель обновлений загрузила все записи, которые сразу же появятся, то следующая панель обновлений начнет работать…. Пожалуйста, помогите мне. (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;
открытый частичный класс _Default: Page
{
///
///
///
///
защищенное переопределение 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
с использованием системы;
открытый частичный класс MainControl: System.Web.UI.UserControl
{
защищенная пустота Page_Load (отправитель объекта, EventArgs e)
{
}
}
HeaderControl.ascx
Критерии поиска
HeaderControl.ascx.cs
используя Систему;
использование System.Web.UI.WebControls;
открытый частичный класс HeaderControl: System.Web.UI.UserControl
{
защищенная пустота Page_Load (отправитель объекта, 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
с использованием системы;
открытый частичный класс BodyControl: System.Web.UI.UserControl
{
защищенная пустота Page_Load (отправитель объекта, 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
с использованием Системы;
using System.Collections.Generic;
использование System.Web.UI;
использование System.Web.UI.WebControls;
открытый частичный класс BodySubControl1: UserControl
{
защищенный void UpdatePanel_DataBinding (отправитель объекта, 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
с использованием системы;
using System.Collections.Generic;
использование System.Web.UI;
использование System.Web.UI.WebControls;
открытый частичный класс BodySubControl2: UserControl
{
защищенный void UpdatePanel_DataBinding (отправитель объекта, 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
с использованием системы;
using System.Collections.Generic;
использование System.Web.UI;
использование System.Web.UI.WebControls;
открытый частичный класс BodySubControl3: UserControl
{
защищенный void UpdatePanel_DataBinding (отправитель объекта, 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
с использованием системы;
using System.Collections.Generic;
использование System.Web.UI;
использование System.Web.UI.WebControls;
открытый частичный класс BodySubControl4: UserControl
{
защищенный void UpdatePanel_DataBinding (отправитель объекта, 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
Параметр конфигурации Asp.Net в Visual Studio.
Полный список настроек и комментариев можно найти в
machine.config.comments обычно находится в
\ Windows \ Microsoft.Net \ Framework \ v2.x \ Config
->
раздел позволяет конфигурировать
режима аутентификации безопасности, используемого
ASP.NET для идентификации входящего пользователя.
->
раздел позволяет конфигурировать
что делать, если / когда происходит необработанная ошибка
во время исполнения запроса. В частности,
это позволяет разработчикам настраивать страницы ошибок 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