ASP.NET自定义Web控件

时间:2011-06-22 23:25:01

标签: asp.net compiler-errors custom-server-controls web-controls asp.net-webcontrol

我遇到了一些问题,现在我不知道如何解决它。 Web控件每秒只更新一个标签所代表的时钟。我的问题是Web控件公开了一个名为'Formato'的属性,用户可以选择以12或24小时的格式显示。这是通过枚举类型完成的,其中西班牙语Doce表示12,Veinticuatro表示24.这是服务器控件的代码:

namespace Ejercicio2RelojControl
{
public enum _FormatoHora
{
    Doce,
    Veinticuatro
}

[DefaultProperty("FormatoHora")]
[ToolboxData("<{0}:Ejercicio2RelojControl runat=server></{0}:Ejercicio2RelojControl>")]
[ToolboxBitmap(typeof(Ejercicio2RelojControl), "Ejercicio2RelojControl.Ejercicio2RelojControl.ico")]
//[Designer("Ejercicio2RelojControl.Ejercicio2RelojControlDesigner, Ejercicio2RelojControl")]
public class Ejercicio2RelojControl : WebControl
{
    public Ejercicio2RelojControl()
    {                      
    }


    [
    //Bindable(true),
    Category("Appearance"),
    //DefaultValue(_FormatoHora.Doce),
    Description(""),
    ]

    public virtual _FormatoHora FormatoHora        
    {
        get
        {                
            //object t = ViewState["FormatoHora"];                
            //return (t == null) ? _FormatoHora.Doce : (_FormatoHora)t;
            object obj2 = this.ViewState["_FormatoHora"];
            if (obj2 != null)
            {
                return (_FormatoHora)obj2;
            }
            return _FormatoHora.Doce;
        }
        set
        {                
            ViewState["_FormatoHora"] = value;
        }
    }

    //Create one TimerControl   
    Timer timer = new Timer();


    private Label clockLabel = new Label();        


    // Declare one Updatepanel
    UpdatePanel updatePanel = new UpdatePanel();

    // Now override the Load event of Current Web Control
    protected override void OnLoad(EventArgs e)
    {                        
        //Text = "hh:mm:ss";
        // Create Ids for Control
        timer.ID = ID + "_tiker";            
        clockLabel.ID = ID + "_l";            
        // get the contentTemplate Control Instance
        Control controlContainer = updatePanel.ContentTemplateContainer;
        // add Label and timer control in Update Panel
        controlContainer.Controls.Add(clockLabel);            
        controlContainer.Controls.Add(timer);      


        // Add control Trigger in update panel on Tick Event
        updatePanel.Triggers.Add(new AsyncPostBackTrigger() { ControlID = timer.ID, EventName = "Tick" });
        updatePanel.ChildrenAsTriggers = true;
        // Set default clock time in label
        clockLabel.Text = DateTime.Now.ToString("h:mm:ss tt");
        //clockLabel.Text = DateTime.Now.ToString("H:mm:ss");            

        // Set Interval
        timer.Interval = 1000;
        // Add handler to timer
        timer.Tick += new EventHandler<EventArgs>(timer_Tick);

        updatePanel.RenderMode = UpdatePanelRenderMode.Block;
        //Add update panel to the base control collection.
        base.Controls.Add(updatePanel);
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(FormatoHora);
    }

    void timer_Tick(object sender, EventArgs e)
    {
        // Set current date time in label to move current at each Tick Event
        clockLabel.Text = DateTime.Now.ToString("h:mm:ss tt");
        //clockLabel.Text = DateTime.Now.ToString("H:mm:ss");                   
    }

}  

}

现在是时候在asp.net Web应用程序中测试自定义控件了。

                      

    <cc1:Ejercicio2RelojControl ID="Ejercicio2RelojControl1" runat="server" />      

效果很好!但是当我添加属性“Formato”在编译时失败时:

                      

    <cc1:Ejercicio2RelojControl ID="Ejercicio2RelojControl1" runat="server" Formato="Doce" />

编译器错误消息:CS0117:'Ejercicio2RelojControl.Ejercicio2RelojControl'不包含'FormatoHora'的定义

为什么Formato属性使Web应用程序在编译时崩溃?

非常感谢。

编辑:

命名空间Ejercicio2RelojControl {     public enum FormatoHora     {         谷,         Veinticuatro     }

[DefaultProperty("FormatoHora")]
[ToolboxData("<{0}:Ejercicio2RelojControl runat=server></{0}:Ejercicio2RelojControl>")]

public class Ejercicio2RelojControl : WebControl, INamingContainer
{

    public FormatoHora FormatoHora
    {
        get
        {                
            object obj2 = this.ViewState["FormatoHora"];
            if (obj2 != null)
            {
                return (FormatoHora)obj2;
            }
            return FormatoHora.Doce;
        }
        set
        {
            ViewState["FormatoHora"] = value;
        }            
    }

如你所见,我改变了公共财产。现在错误已经改变。如下:

编译器错误消息:CS0120:非静态字段,方法或属性'Ejercicio2RelojControl.Ejercicio2RelojControl.FormatoHora.get'

需要对象引用

任何帮助表示赞赏。感谢

编辑2:

我发现问题出现在集{}上。如果我发表评论,一切正常,但我不能在12到24之间更改FormatoHora,因为只有get {}才能实现。有关实现set {}?

的任何帮助

1 个答案:

答案 0 :(得分:1)

我在这里为您提供解决方案: 您对命名空间和webcontrol(Ejercicio2RelojControl)使用相同的名称。只需更改它,您的代码就可以正常工作。

希望它有所帮助,尽管已经过去几年了:)