Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义数据寻呼机的问题_C#_Asp.net_Custom Controls_Datapager - Fatal编程技术网

C# 自定义数据寻呼机的问题

C# 自定义数据寻呼机的问题,c#,asp.net,custom-controls,datapager,C#,Asp.net,Custom Controls,Datapager,我正在尝试将asp.netDataPager控件扩展为具有预定义模板的自定义控件。这是期望的输出 问题: 当我第一次加载包含自定义DataPager的页面时,我的ObjectDataSource的SelectMethod会被调用3次 当我尝试使用DataPager加载另一页数据时,SelectMethod会被调用两次 当我尝试使用下一页/上一页按钮或下拉列表加载另一页数据时,该页不会更改。我运行了一些调试,发现它没有将正确的值传递给SelectMethod的StartRowindExpPara

我正在尝试将asp.net
DataPager
控件扩展为具有预定义模板的自定义控件。这是期望的输出

问题

  • 当我第一次加载包含自定义DataPager的页面时,我的
    ObjectDataSource
    SelectMethod
    会被调用3次
  • 当我尝试使用DataPager加载另一页数据时,SelectMethod会被调用两次
  • 当我尝试使用下一页/上一页按钮或下拉列表加载另一页数据时,该页不会更改。我运行了一些调试,发现它没有将正确的值传递给SelectMethod的StartRowindExpParameter(它每次调用该方法时都传递0) 这是我的自定义控件的代码

    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 | "));
        }
    }