您好我正在设计一个继承自aspx下拉列表的自定义.net Web控件。 我们的想法是建立一个下拉列表,显示当年之前的年份值。我希望能够设置控件可以从其开始的“StartYear”属性,或者使用默认日期。我能够创建此控件但它总是使用defult日期。看来我无法在后面的代码中使用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;
}
}
}
}
答案 0 :(得分: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()));
}
}
}
我已经测试并验证了上面的代码,它绝对是工作。我注意到一个有趣的事情是,我能够重现你的问题一段时间,因为属性设置器没有被击中。我通过右键单击解决方案并单击“清除”来解决此问题。解决方案清理后,我再次右键单击解决方案,但这次选择了Rebuild。这似乎解决了财产制定者的问题。
答案 1 :(得分: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()));
}
}
}