2

こんにちは、aspx ドロップダウン リストから継承するカスタム .net Web コントロールを設計しています。アイデアは、現在の年までの年の値を表示するドロップダウン リストを持つことです。コントロールが開始できる「StartYear」プロパティを設定できるようにしたい、またはデフォルトの日付を使用できるようにしたい。このコントロールを作成することはできますが、常にデフォルトの日付を使用しています。コード ビハインドの aspx コードでプロパティ設定を使用できないようです。私のフロントエンドコードは....

<customControls:YearDropDownList StartYear="2000" ID="ddlYear" runat="server"/>

コードビハインドは

using System;
using System.ComponentModel;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;

    namespace customControls {
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    [DefaultProperty("StartYear")]
    public class YearDropDownList : DropDownList
    {
        public YearDropDownList() {
            for (int i = Int32.Parse(StartYear); i <= DateTime.Now.Year; i++)
            {
                this.Items.Add(new ListItem(i.ToString(), i.ToString()));
            }
        }
        public string StartYear {
            get{
                String s = (String)ViewState["StartYear"];
                return ((s == null) ? "2009":s);
            }
            set{
                ViewState["StartYear"] = value;
            }
        }
    }
    }
4

2 に答える 2

1

プロパティがそのように設定されている場合は、リストを再生成する必要があります。

[ToolboxData("<{0}:YearDropDownList runat=\"server\" StartYear=\"[StartYear]\"></{0}:YearDropDownList>")]
[DefaultProperty("StartYear")]
public class YearDropDownList : DropDownList
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        RegenerateList();
    }
    public string StartYear
    {
        get
        {
            String s = (String)this.ViewState["StartYear"];
            return s ?? "2009";
        }
        set
        {
            ViewState["StartYear"] = value;
            RegenerateList();
        }
    }
    public void RegenerateList()
    {
        Items.Clear();
        for (int i = Int32.Parse(this.StartYear); i <= DateTime.Now.Year; i++)
        {
            this.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }
    }
}

私は上記のコードをテストして検証しましたが、それは間違いなく機能します。私が気付いた興味深いことは、プロパティセッターがヒットしていなかったという点で、しばらくの間あなたの問題を再現することができたということでした。ソリューションを右クリックして[クリーン]をクリックすることで、これを解決しました。ソリューションがクリーンアップされた後、ソリューションをもう一度右クリックしましたが、今回は[再構築]を選択しました。それはプロパティセッターの問題を解決したようです。

于 2013-02-28T18:00:26.057 に答える
1

私の考えでは、コンストラクターでリストを再生成するのは意味がありません。コントロールがインスタンス化された時点では、ViewState はおそらくまだ設定されていないため (これについてはよくわかりません)、常にデフォルト値が使用されます。

これが私がすることです:

[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
[DefaultProperty("StartYear")]
public class YearDropDownList : DropDownList
{
    public string StartYear
    {
        get
        {
            String s = (String)ViewState["StartYear"];
            return ((s == null) ? "2009" : s);
        }
        set
        {
            ViewState["StartYear"] = value;
            RegenerateList();
        }
    }

    // Defer regenerating the list until as late as possible    
    protected void OnPreRender(EventArgs e)
    {
        RegenerateList();
        base.OnPreRender(e);
    }

    public void RegenerateList()
    {
        // Remove any existing items.
        this.Items.Clear();
        for (int i = Int32.Parse(StartYear); i <= DateTime.Now.Year; i++)
        {
            this.Items.Add(new ListItem(i.ToString(), i.ToString()));
        }
    }
}
于 2013-02-28T18:27:55.800 に答える