首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExtenderControl未按预期工作

ExtenderControl未按预期工作
EN

Stack Overflow用户
提问于 2012-11-23 12:06:20
回答 1查看 296关注 0票数 1

我正在尝试制作我自己版本的中继器控制。它不是DataBoundControl;它不会绑定到DataSource、DataSourceID、DataBind方法等。它有一个嵌套在它里面的模板,还有一个名为RepeatCount的属性,它将重复上面提到的属性所指定的模板中的任何内容。

但是,如果在模板中添加文本框和与其关联的自动完成扩展程序,自动完成功能就会中断。下面的图片显示了大量的问题:

  • 注意生成的文本框ids。我所添加的只是在模板中添加了一个带有TextBox的ID="TextBox1",但是相同的名称/id被重复多次。
  • 您可以看到文本框是可见的。要理解为什么它是可见的,请查看后面的代码并查看ItemPreRender事件。 我已经处理过(在aspx页面上)。如果我没有写这样的代码,我就会得到一个例外:

  • 然而,正如在pt2中提到的那样,编写代码并没有给我带来任何帮助。自动完成功能无法正常工作。

这里有什么问题吗?如果把这个放进一个中继器控制器并以类似的方式工作,它就能工作了.

我在这里错过了什么?

下面是我分享的源代码的一部分:

aspx页面

代码语言:javascript
复制
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyRepeaterComplex.aspx.cs" Inherits="RelationalGridView.Web.MyRepeaterComplex" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc2" %>

<%@ Register Assembly="WebGui.Extensions" Namespace="WebGui.Extensions.MyRepeater"
    TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>MyRepeater Sample</title>
    <style type="text/css">
        /*AutoComplete flyout */

        .autocomplete_completionListElement 
        {  
            margin : 0px!important;
            background-color : inherit;
            color : windowtext;
            border : buttonshadow;
            border-width : 1px;
            border-style : solid;
            cursor : 'default';
            overflow : auto;
            height : 200px;
            text-align : left; 
            list-style-type : none;
        }

        /* AutoComplete highlighted item */

        .autocomplete_highlightedListItem
        {
            background-color: #ffff99;
            color: black;
            padding: 1px;
        }

        /* AutoComplete item */

        .autocomplete_listItem 
        {
            background-color : window;
            color : windowtext;
            padding : 1px;
        }

    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <cc1:MyRepeater ID="MyRepeater1" runat="server" RepeatCount="10">
            <Template>
                <p>Enter Name: <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></p>                
                <cc2:AutoCompleteExtender 
                    ID="AutoCompleteExtender1" 
                    runat="server" 
                    TargetControlID="TextBox1"
                    ServicePath="AutoComplete.asmx" 
                    ServiceMethod="GetCompletionList"
                    MinimumPrefixLength="2" 
                    CompletionInterval="1000"
                    EnableCaching="true"
                    CompletionSetCount="20"
                    CompletionListCssClass="autocomplete_completionListElement" 
                    CompletionListItemCssClass="autocomplete_listItem" 
                    CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem"
                    DelimiterCharacters=";, :"
                    ShowOnlyCurrentWordInCompletionListItem="true">
                </cc2:AutoCompleteExtender>
            </Template>
        </cc1:MyRepeater>
    </div>
    </form>
</body>
</html>

Apsx代码背后:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;

namespace RelationalGridView.Web
{
    public partial class MyRepeaterComplex : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //MyRepeater1.ItemPreRender += new WebGui.Extensions.MyRepeater.MyRepeaterItemPreRenderDelegate(MyRepeater1_ItemPreRender);
        }

        protected void MyRepeaterItemPrerender(object sender, WebGui.Extensions.MyRepeater.MyRepeaterItemEventArgs e)
        {
            TextBox tbx = (TextBox)e.Container.FindControl("TextBox1");
            AutoCompleteExtender ace = (AutoCompleteExtender)e.Container.FindControl("AutoCompleteExtender1");
            ScriptManager.GetCurrent(this).RegisterExtenderControl(ace, tbx);
        }


    }
}

MyRepeater代码

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Collections;

namespace WebGui.Extensions.MyRepeater
{
    public delegate void MyRepeaterItemPreRenderDelegate(object sender, MyRepeaterItemEventArgs e);
    public class MyRepeater: WebControl
    {
        List<Control> Containers;
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [TemplateContainer(typeof(MyRepeaterTemplateContainer))]
        public ITemplate Template { get; set; }

        public event MyRepeaterItemPreRenderDelegate ItemPreRender;

        public MyRepeater()
        {
            RepeatCount = 0;
            Containers = new List<Control>();
        }

        public int RepeatCount { get; set; }       

        protected override void OnPreRender(EventArgs e)
        {
            MyRepeaterItemEventArgs ex = new MyRepeaterItemEventArgs();
            for (int i = 0; i < RepeatCount; i++)
            {
                MyRepeaterTemplateContainer container = new MyRepeaterTemplateContainer();
                container.Page = Page;
                Template.InstantiateIn(container);
                if (ItemPreRender != null)
                {
                    ex.Container=container;
                    ItemPreRender(this, ex);
                }
                Containers.Add(container);
            }            
        }

        protected override void Render(HtmlTextWriter writer)
        {            
            foreach (Control ctrl in Containers)
            {                
                ctrl.RenderControl(writer);
                writer.WriteLine();
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 19:02:32

与在OnPreRender方法中实例化模板不同,您需要使用CreateChildControls方法。此方法用于创建子控件。造成这个问题的原因是您的扩展程序在Page生命周期中被添加到控件集合中太晚了,这就是为什么不能注册它。

我可以建议使用复合控件作为基本控件,而不是WebControl。迪诺·埃斯波西托有一篇很好的关于这个领域的文章:http://msdn.microsoft.com/en-us/library/aa479016.aspx

还要注意:如果您创建从WebControl继承的自定义服务器控件,并且希望同一个命名容器中的两个实例(如页或其他)具有不同的子控件ids,那么您需要用INamingContainer接口标记您的自定义控件。更多信息可以在本文中找到:http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13528833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档