1

我遇到了一些问题,现在我不知道如何解决它。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 { 公共枚举FormatoHora { Doce,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{} 的实施有任何帮助吗?

4

1 回答 1

1

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

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

于 2016-06-10T12:35:26.590 回答