ASP.NET - 在构造期间将项目添加到下拉列表

时间:2012-04-10 06:26:52

标签: c# asp.net constructor

我有一个网络user control,其中包含三个dropdownlists:一个持有数天,第二个持有数月,第三个持有数年。天和月是静态的。但是年份项目将根据需要改变,以避免进入错误的一年。让我先在这里列出我按顺序做的事情,然后我会问我的问题:

  1. 我有一个私人int yearSpan。
  2. 在私有方法PopulateYearList中我说:

    int year = DateTime.Now.Year;
    int span = year - this.yearSpan;
    for (int i = span; i <= year; i++)
    {
        ddlYears.Items.Add(i.ToString());//Here I get NullReferenceException
    }
    
  3. 我已经覆盖默认构造函数以接收yearSpan作为参数:

     public DatePicker(int yearSpan)
     {
        this.yearSpan = yearSpan;
        this.PopulateYearList();
     }
    
  4. 现在,正如您可能已经在PopulateYearList方法中猜到的那样,我得到了NullReferenceException,因为我尝试将项目添加到尚未构建的ddlYears。你有什么建议来解决这个问题?

2 个答案:

答案 0 :(得分:1)

不要在构造函数中调用this.PopulateYearList,而是在用户控件的Load事件上调用它。

此外,我更喜欢你不使用你的用户控件的构造函数,而是使用公共属性,因为它可以保持其状态。

e.g。在页面:

protected void Page_Load(object sender, EventArgs e)
{
   UserControl1.TimeSpan = DateTime.Now.Year;
}

在UserControl中:

protected void Page_PreRender(object sender, EventArgs e)
{
    if(this.IsPostBack) 
    {
      PopulateYearList() 
    }
}

只要您不从父页面对该控件进行任何更改,加载控件后的任何事件,都可以调用this.PopulateYearList。我在PreRender事件中调用它,好像有人更改了页面中的值,它最后会被用户控件值覆盖,因此我确信我的值没有被调整。

如果我遗失了某些内容,请告诉我。

答案 1 :(得分:0)

以太网呼叫PopulateYearList的{​​{1}}中的Page_Load。像这样:

usercontrol

或者protected void Page_Load(object objSrc, EventArgs e) { if(this.IsPostBack) PopulateYearList() } PopulateYearList并在绑定public控件

时在page上调用它