C# 自定义数据寻呼机的问题
我正在尝试将asp.netC# 自定义数据寻呼机的问题,c#,asp.net,custom-controls,datapager,C#,Asp.net,Custom Controls,Datapager,我正在尝试将asp.netDataPager控件扩展为具有预定义模板的自定义控件。这是期望的输出 问题: 当我第一次加载包含自定义DataPager的页面时,我的ObjectDataSource的SelectMethod会被调用3次 当我尝试使用DataPager加载另一页数据时,SelectMethod会被调用两次 当我尝试使用下一页/上一页按钮或下拉列表加载另一页数据时,该页不会更改。我运行了一些调试,发现它没有将正确的值传递给SelectMethod的StartRowindExpPara
DataPager
控件扩展为具有预定义模板的自定义控件。这是期望的输出
问题:
ObjectDataSource
的SelectMethod
会被调用3次public class DataPagerDDL : DataPager
{
protected override void RenderContents(HtmlTextWriter writer)
{
//add custom template
TemplatePagerField templateField = new TemplatePagerField();
templateField.PagerTemplate = new CustomTemplate();
Fields.Add(templateField);
//add previous/next page template
NextPreviousPagerField nextPreviousField = new NextPreviousPagerField();
nextPreviousField.ShowFirstPageButton = false;
nextPreviousField.ShowLastPageButton = false;
nextPreviousField.PreviousPageText = "<<";
nextPreviousField.NextPageText = ">>";
Fields.Add(nextPreviousField);
base.RenderContents(writer);
}
public void cmbPage_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList cmbPage = (DropDownList)sender;
this.SetPageProperties(cmbPage.SelectedIndex * MaximumRows, MaximumRows, true);
}
}
public class CustomTemplate : ITemplate
{
/// <summary>
/// Insert an instance of text and controls into the specified container.
/// </summary>
public void InstantiateIn(Control container)
{
DataPagerFieldItem caller = (DataPagerFieldItem)container;
DataPagerDDL pager = (DataPagerDDL)caller.Parent;
int totalPages = pager.TotalRowCount / pager.MaximumRows;
if (pager.TotalRowCount % pager.MaximumRows > 0) totalPages += 1;
int currentPage = (pager.StartRowIndex / pager.MaximumRows) + 1;
DropDownList cmbPage = new DropDownList();
cmbPage.ID = "cmbPage";
cmbPage.AutoPostBack = true;
cmbPage.SelectedIndexChanged += new EventHandler(pager.cmbPage_SelectedIndexChanged);
for (int i = 1; i <= totalPages; i++)
{
ListItem item = new ListItem(i.ToString(), i.ToString());
if (i == currentPage) item.Selected = true;
cmbPage.Items.Add(item);
}
pager.Controls.Add(new LiteralControl("Page "));
pager.Controls.Add(cmbPage);
pager.Controls.Add(new LiteralControl(" of " + totalPages.ToString() + " pages | "));
}
}
公共类DataPagerDDL:DataPager
{
受保护的覆盖无效呈现内容(HtmlTextWriter)
{
//添加自定义模板
TemplatePagerField templateField=新建TemplatePagerField();
templateField.PagerTemplate=新的CustomTemplate();
字段。添加(templateField);
//添加上一页/下一页模板
NextPreviousPagerField nextPreviousField=新建NextPreviousPagerField();
nextPreviousField.ShowFirstPageButton=false;
nextPreviousField.ShowLastPageButton=false;
nextPreviousField.PreviousPageText=“”;
字段。添加(nextPreviousField);
基本渲染内容(编写器);
}
公共无效CMB页面\u选择的索引已更改(对象发件人,事件参数e)
{
DropDownList cmbPage=(DropDownList)发送方;
this.SetPageProperties(cmbPage.SelectedIndex*MaximumRows,MaximumRows,true);
}
}
公共类CustomTemplate:ITemplate
{
///
///将文本和控件的实例插入指定的容器中。
///
公共容器(控制容器)
{
DataPagerFieldItem调用者=(DataPagerFieldItem)容器;
DataPagerDDL pager=(DataPagerDDL)caller.Parent;
int totalPages=pager.TotalRowCount/pager.MaximumRows;
如果(pager.TotalRowCount%pager.MaximumRows>0)totalPages+=1;
int currentPage=(pager.StartRowIndex/pager.MaximumRows)+1;
DropDownList cmbPage=新的DropDownList();
cmbPage.ID=“cmbPage”;
cmbPage.AutoPostBack=true;
cmbPage.SelectedIndexChanged+=新事件处理程序(pager.cmbPage\u SelectedIndexChanged);
对于(int i=1;i我怀疑您在页面生命周期中创建寻呼机字段太晚了。请尝试从DataPagerDDL
类的Init
事件创建它们
另外,您的CustomTemplate
应该将控件添加到容器中,而不是页面中
public class DataPagerDDL : DataPager
{
protected override void OnInit(EventArgs e)
{
CreateDefaultPagerFields();
base.OnInit(e);
}
protected virtual void CreateDefaultPagerFields()
{
//add custom template
TemplatePagerField templateField = new TemplatePagerField();
templateField.PagerTemplate = new CustomTemplate();
Fields.Add(templateField);
//add previous/next page template
NextPreviousPagerField nextPreviousField = new NextPreviousPagerField();
nextPreviousField.ShowFirstPageButton = false;
nextPreviousField.ShowLastPageButton = false;
nextPreviousField.PreviousPageText = "<<";
nextPreviousField.NextPageText = ">>";
Fields.Add(nextPreviousField);
}
public void cmbPage_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList cmbPage = (DropDownList)sender;
SetPageProperties(cmbPage.SelectedIndex * MaximumRows, MaximumRows, true);
}
}
public class CustomTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
DataPagerFieldItem caller = (DataPagerFieldItem)container;
DataPagerDDL pager = (DataPagerDDL)caller.Parent;
int totalPages = pager.TotalRowCount / pager.MaximumRows;
if (pager.TotalRowCount % pager.MaximumRows > 0) totalPages += 1;
int currentPage = (pager.StartRowIndex / pager.MaximumRows) + 1;
DropDownList cmbPage = new DropDownList();
cmbPage.ID = "cmbPage";
cmbPage.AutoPostBack = true;
cmbPage.SelectedIndexChanged += pager.cmbPage_SelectedIndexChanged;
for (int i = 1; i <= totalPages; i++)
{
ListItem item = new ListItem(i.ToString(), i.ToString());
if (i == currentPage) item.Selected = true;
cmbPage.Items.Add(item);
}
container.Controls.Add(new LiteralControl("Page "));
container.Controls.Add(cmbPage);
container.Controls.Add(new LiteralControl(" of " + totalPages + " pages | "));
}
}
公共类DataPagerDDL:DataPager
{
受保护的覆盖无效OnInit(事件参数e)
{
CreateDefaultPagerFields();
碱基.奥尼特(e);
}
受保护的虚拟void CreateDefaultPagerFields()
{
//添加自定义模板
TemplatePagerField templateField=新建TemplatePagerField();
templateField.PagerTemplate=新的CustomTemplate();
字段。添加(templateField);
//添加上一页/下一页模板
NextPreviousPagerField nextPreviousField=新建NextPreviousPagerField();
nextPreviousField.ShowFirstPageButton=false;
nextPreviousField.ShowLastPageButton=false;
nextPreviousField.PreviousPageText=“”;
字段。添加(nextPreviousField);
}
公共无效CMB页面\u选择的索引已更改(对象发件人,事件参数e)
{
DropDownList cmbPage=(DropDownList)发送方;
SetPageProperties(cmbPage.SelectedIndex*MaximumRows,MaximumRows,true);
}
}
公共类CustomTemplate:ITemplate
{
公共容器(控制容器)
{
DataPagerFieldItem调用者=(DataPagerFieldItem)容器;
DataPagerDDL pager=(DataPagerDDL)caller.Parent;
int totalPages=pager.TotalRowCount/pager.MaximumRows;
如果(pager.TotalRowCount%pager.MaximumRows>0)totalPages+=1;
int currentPage=(pager.StartRowIndex/pager.MaximumRows)+1;
DropDownList cmbPage=新的DropDownList();
cmbPage.ID=“cmbPage”;
cmbPage.AutoPostBack=true;
cmbPage.SelectedIndexChanged+=pager.cmbPage\u SelectedIndexChanged;
对于(int i=1;我发现了,谢谢!通常建议在Init上设置控件的属性吗?如果控件在标签上有其他自定义属性,例如用户名
属性,该怎么办?我有另一个自定义控件,我尝试在Init上设置属性,但不起作用。我认为这是因为自定义属性不可用值(在HTML标记中设置)直到加载事件之后才检索。对吗?在控件的Init
事件中设置属性在很大程度上等同于在页面标记中设置属性。属性值不会存储在ViewState
中,因此您必须在每个请求中设置它们;如果(!IsPostBack),则不要将代码包装在中
block。当您动态修改控件树时,Init
事件通常是您要进行更改的最新点,以确保动态控件可以参与回发后事件处理。采用OnInit
方法为我解决了一个不相关的问题。我使用的是CreateChildControls()
来实例化模板。除了没有数据的情况外,这一切都很好。出于某种原因,此调用将自身级联并导致堆栈溢出。通过重构代码,以本文的方式实例化,解决了此问题。
public class DataPagerDDL : DataPager
{
protected override void OnInit(EventArgs e)
{
CreateDefaultPagerFields();
base.OnInit(e);
}
protected virtual void CreateDefaultPagerFields()
{
//add custom template
TemplatePagerField templateField = new TemplatePagerField();
templateField.PagerTemplate = new CustomTemplate();
Fields.Add(templateField);
//add previous/next page template
NextPreviousPagerField nextPreviousField = new NextPreviousPagerField();
nextPreviousField.ShowFirstPageButton = false;
nextPreviousField.ShowLastPageButton = false;
nextPreviousField.PreviousPageText = "<<";
nextPreviousField.NextPageText = ">>";
Fields.Add(nextPreviousField);
}
public void cmbPage_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList cmbPage = (DropDownList)sender;
SetPageProperties(cmbPage.SelectedIndex * MaximumRows, MaximumRows, true);
}
}
public class CustomTemplate : ITemplate
{
public void InstantiateIn(Control container)
{
DataPagerFieldItem caller = (DataPagerFieldItem)container;
DataPagerDDL pager = (DataPagerDDL)caller.Parent;
int totalPages = pager.TotalRowCount / pager.MaximumRows;
if (pager.TotalRowCount % pager.MaximumRows > 0) totalPages += 1;
int currentPage = (pager.StartRowIndex / pager.MaximumRows) + 1;
DropDownList cmbPage = new DropDownList();
cmbPage.ID = "cmbPage";
cmbPage.AutoPostBack = true;
cmbPage.SelectedIndexChanged += pager.cmbPage_SelectedIndexChanged;
for (int i = 1; i <= totalPages; i++)
{
ListItem item = new ListItem(i.ToString(), i.ToString());
if (i == currentPage) item.Selected = true;
cmbPage.Items.Add(item);
}
container.Controls.Add(new LiteralControl("Page "));
container.Controls.Add(cmbPage);
container.Controls.Add(new LiteralControl(" of " + totalPages + " pages | "));
}
}