ASP.NET控件渲染管道

时间:2009-06-23 09:04:42

标签: c# asp.net controls rendering pipeline

我正在构建一个寻呼机控件的问题。我的代码如下

protected override void CreateChildControls()
{
  base.CreateChildControls();

  pnl = new Panel { ID = "NewsPager", CssClass = "NewsPager" };
  Controls.Add(ddl);

  AddPagerControls();
}

AddPagerControls添加了一堆使用相同事件处理程序的LinkBut​​tons:

private void li_Click(object sender, EventArgs e)
{
  selectedValue = ((LinkButton) sender).CommandArgument;
  AddPagerControls();
}

现在发生的是当我添加“Next”LinkBut​​ton时,它使用以下命令正确设置CommandArgument:

var liNext = new LinkButton {ID = "NewsPagerLinkNext", Text = ">", CommandArgument = (int.Parse(value) + 1).ToString()};
liNext.Click += new EventHandler(li_Click);
pnl.Controls.Add(liNext);

即。如果当前页面为2,则在调试代码时,“Next”按钮的CommandArgument将为3。 但是,当页面已经渲染并且我单击下一个按钮时它将工作一次(从第1页到第2页)但是它总是2,即使在代码中它被设置为3.所以当控件必须发生时渲染。

我在这里有点不知所措。我尝试将对CreateChildControls中的AddPagerControls的调用更改为if(!Page.IsPostBack){AddPagerControls();}但是事件处理程序根本不会触发。

编辑: P.S.I从事件处理程序调用AddPagerControls方法时执行pnl.Controls.Clear(),否则将添加两次LinkBut​​tons。

编辑:P.P.S。我重新确认每次添加哪个链接按钮,因为如果存在更多页面,我只需要显示5个链接,即

<< < 2 3 4 5 6 7> >>

1 个答案:

答案 0 :(得分:0)

我不明白为什么你一直重新生成分页控件。难道你不能只使用你的链接按钮“prev”和“next”的方法,你在你的控件的视图状态(作为单独的属性)维护正在查看的当前页面和项目的数量(即页面大小)?

在事件处理程序中,您可以执行正确的操作,因为您知道当前页面将类似currentPageIndex+1或类似的内容。从我的角度来看,重新生成prev / next按钮,特别是在l i_Click处理程序中并不是一个好方法,这也可能导致你的问题。