ASP.NET Custom Web Control - PullRequest
       25

ASP.NET Custom Web Control

1 голос
/ 23 июня 2011

У меня возникли некоторые проблемы, и сейчас я не знаю, как их решить. Веб-элемент управления просто обновляет часы, представленные меткой, каждую секунду. Моя проблема заключается в том, что веб-элемент управления предоставляет свойство под названием «Formato», которое пользователь может выбрать для отображения в формате 12 или 24 часа. Это делается с типом enum, где на испанском языке 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.

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

Отлично работает! НО при добавлении свойства «Formato» происходит сбой во время компиляции:

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

Сообщение об ошибке компилятора: CS0117: «Ejercicio2RelojControl.Ejercicio2RelojControl» не содержит определения для «FormatoHora»

Почему свойство Formato вызывает сбой веб-приложения во время компиляции?

Большое спасибо.

EDIT:

namespace 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:

Я обнаружил, что проблема на съемочной площадке {}. Если я это прокомментирую, все работает нормально, но тогда я не могу изменить FormatoHora между 12 и 24, потому что только для чтения, потому что реализован только get {}. Любая помощь с реализацией набора {}?

1 Ответ

1 голос
/ 10 июня 2016

Я здесь, чтобы дать вам решение: Вы используете одно и то же имя для пространства имен и для веб-управления (Ejercicio2RelojControl). Просто измените это, и ваш код будет работать нормально.

Надеюсь, это поможет, несмотря на то, что прошло несколько лет :)

...