为 asp 中的动态 link 按钮触发我的事件时出现问题
Problems firing my event for dynamically link buttons in asp
我在 asp 页面中的动态 link 按钮有问题。我使用它们为网格视图制作自定义分页。我的想法是我想显示 20 个大约 20 个。前 20 个正在工作。当我显示它们时就没问题了。然后我按 next 显示下一个 20。当我按 next 时,它显示我,但是如果按一个按钮而不是最初的 20,它会在第一个 20.
我的初始页面:
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
if (this.Tag.Equals("Shareholder"))
{
InitComponents(false);
}
/// Must be done everytime the page loads.
InitializeList();
if (!IsPostBack)
InitializeUI();
}
初始化link个按钮
private void InitComponents(Boolean Prev)
{
PanelPager.Controls.Clear();
int nrInregistrari = Convert.ToInt32(DAActionar.CountActionari(11, LastBtnIndex));
if (Prev == true)
{
LinkButton lnkPrev = new LinkButton();
lnkPrev.Text = "Prev";
PanelPager.Controls.Add(lnkPrev);
}
int BtnDeAfisat = 0;
if (nrInregistrari > BTN_PER_SERIE * PAGE_SIZE)
{
BtnDeAfisat = BTN_PER_SERIE;
}
else
BtnDeAfisat = nrInregistrari / PAGE_SIZE + 1;
for (int index = 1; index <= BtnDeAfisat; index++)
{
int pageNo = index + LastBtnIndex;
LinkButton lnk = new LinkButton();
lnk.Click += new EventHandler(PageChange);
lnk.ID = "PageLink" + pageNo.ToString();
lnk.CommandName = "Page";
lnk.Text = " " + pageNo.ToString() + " ";
lnk.CommandArgument = index.ToString();
PanelPager.Controls.Add(lnk);
}
LinkButton lnkNext = new LinkButton();
lnkNext.Click += new EventHandler(NextPage);
lnkNext.Text = "Next";
PanelPager.Controls.Add(lnkNext);
LastBtnIndex += BtnDeAfisat;
}
下一个按钮的事件
private void NextPage(object sender, EventArgs e)
{
InitComponents(true);
}
页面更改:
public void PageChange(object sender, EventArgs e)
{
int pageIndex = int.Parse((sender as LinkButton).CommandArgument) + 1;
object dataSource = GetDataSource(OwnerId, null, pageIndex);
PushData(dataSource);
}
在 ASP.NET 中,只有作为 Page_Load 的一部分添加的控件才会附加其事件并执行。同样在执行服务器端事件时,页面将自己回发,在此期间 page_load 首先执行,然后执行事件处理程序代码。
因此,您执行的第一组按钮事件是因为它们作为 page_load 的一部分附加到事件。现在,在这些按钮事件期间,您正在调用 InitComponents 方法。因此,正如我在 page_load 事件期间解释的那样,它首先调用 InitComponents 方法,该方法将按钮添加到面板,但 InitComponents 方法作为事件处理程序代码的一部分再次执行,该代码从面板中删除控件并 re-creates 它们并添加它们再次进入小组。
现在,由于在第二次执行 InitComponents 方法期间创建的控件不是 page_load 的一部分,因此当您单击它们时,附加到它们的流事件不会触发。它只是回发再次执行 InitComponents 并在面板中创建新控件的页面,它们的事件将正常工作,因为它们是作为 page_load 流程的一部分创建的。
如果让您感到困惑,请原谅。
现在解决这个问题的方法是使用一个控件,它可以根据项目的数量自动为您创建许多按钮,并始终触发事件。
我现在没有任何适合你的东西。我发现这篇文章带有工作示例代码,您可以将其视为示例并在您的工作中实施。
http://www.aspsnippets.com/Articles/Implement-Paging-in-DataList-control-in-ASPNet.aspx
该示例说明了如何显示页码以及如何根据所选页码绑定数据。
我在 asp 页面中的动态 link 按钮有问题。我使用它们为网格视图制作自定义分页。我的想法是我想显示 20 个大约 20 个。前 20 个正在工作。当我显示它们时就没问题了。然后我按 next 显示下一个 20。当我按 next 时,它显示我,但是如果按一个按钮而不是最初的 20,它会在第一个 20.
我的初始页面:
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
if (this.Tag.Equals("Shareholder"))
{
InitComponents(false);
}
/// Must be done everytime the page loads.
InitializeList();
if (!IsPostBack)
InitializeUI();
}
初始化link个按钮
private void InitComponents(Boolean Prev)
{
PanelPager.Controls.Clear();
int nrInregistrari = Convert.ToInt32(DAActionar.CountActionari(11, LastBtnIndex));
if (Prev == true)
{
LinkButton lnkPrev = new LinkButton();
lnkPrev.Text = "Prev";
PanelPager.Controls.Add(lnkPrev);
}
int BtnDeAfisat = 0;
if (nrInregistrari > BTN_PER_SERIE * PAGE_SIZE)
{
BtnDeAfisat = BTN_PER_SERIE;
}
else
BtnDeAfisat = nrInregistrari / PAGE_SIZE + 1;
for (int index = 1; index <= BtnDeAfisat; index++)
{
int pageNo = index + LastBtnIndex;
LinkButton lnk = new LinkButton();
lnk.Click += new EventHandler(PageChange);
lnk.ID = "PageLink" + pageNo.ToString();
lnk.CommandName = "Page";
lnk.Text = " " + pageNo.ToString() + " ";
lnk.CommandArgument = index.ToString();
PanelPager.Controls.Add(lnk);
}
LinkButton lnkNext = new LinkButton();
lnkNext.Click += new EventHandler(NextPage);
lnkNext.Text = "Next";
PanelPager.Controls.Add(lnkNext);
LastBtnIndex += BtnDeAfisat;
}
下一个按钮的事件
private void NextPage(object sender, EventArgs e)
{
InitComponents(true);
}
页面更改:
public void PageChange(object sender, EventArgs e)
{
int pageIndex = int.Parse((sender as LinkButton).CommandArgument) + 1;
object dataSource = GetDataSource(OwnerId, null, pageIndex);
PushData(dataSource);
}
在 ASP.NET 中,只有作为 Page_Load 的一部分添加的控件才会附加其事件并执行。同样在执行服务器端事件时,页面将自己回发,在此期间 page_load 首先执行,然后执行事件处理程序代码。
因此,您执行的第一组按钮事件是因为它们作为 page_load 的一部分附加到事件。现在,在这些按钮事件期间,您正在调用 InitComponents 方法。因此,正如我在 page_load 事件期间解释的那样,它首先调用 InitComponents 方法,该方法将按钮添加到面板,但 InitComponents 方法作为事件处理程序代码的一部分再次执行,该代码从面板中删除控件并 re-creates 它们并添加它们再次进入小组。
现在,由于在第二次执行 InitComponents 方法期间创建的控件不是 page_load 的一部分,因此当您单击它们时,附加到它们的流事件不会触发。它只是回发再次执行 InitComponents 并在面板中创建新控件的页面,它们的事件将正常工作,因为它们是作为 page_load 流程的一部分创建的。
如果让您感到困惑,请原谅。
现在解决这个问题的方法是使用一个控件,它可以根据项目的数量自动为您创建许多按钮,并始终触发事件。
我现在没有任何适合你的东西。我发现这篇文章带有工作示例代码,您可以将其视为示例并在您的工作中实施。
http://www.aspsnippets.com/Articles/Implement-Paging-in-DataList-control-in-ASPNet.aspx
该示例说明了如何显示页码以及如何根据所选页码绑定数据。