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' の定義が含まれていません

コンパイル時にプロパティ Formatto が Web アプリをクラッシュさせるのはなぜですか?

どうもありがとう。

編集:

名前空間 Ejercicio2RelojControl { public enum 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:

問題はセット {} にあることがわかりました。コメントすると、すべて正常に動作しますが、get{} のみが実装されているため、読み取り専用であるため、12 から 24 の間で FormatHora を変更できません。set{} の実装に関するヘルプはありますか?

4

1 に答える 1