1

我遇到了一些问题,现在我不知道如何解决它。 Web控件每秒更新一个标签所代表的时钟。我的问题是,Web控件暴露了一个名为'Formato'的属性,用户可以选择以12或24小时格式显示。ASP.NET自定义Web控件

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来测试自定义控制:这是在西班牙谷这里指12和Veinticuatro意味着24.这是服务器控件的代码中的枚举类型来完成.net网络应用程序。

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

的伟大工程!但是当我添加属性 “Formato” 失败在编译时:

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

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

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

非常感谢。

编辑:

命名空间Ejercicio2RelojControl { 公共枚举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,因为只读是由于只有{}被实现。任何有关set {}的实现的帮助?

+1

有些东西不同步。你说你的web控件暴露了一个名为'Formato'的属性,但是你的代码示例中的属性是'FormatoHora',并且你在自定义控件示例中设置了'Formato',并且错误消息显示'FormatoHora'不存在。这是什么? – mellamokb

+0

我已经稍微编辑了自定义控件。 – user354427

+0

我发现问题出在set {}上。如果我评论它,一切工作正常,但我不能改变12和24之间的FormatoHora,因为只读是由于只有{}被实现。任何有关set {}的实现的帮助? – user354427

回答

1

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

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