2

我有一个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();
     }
    

现在,正如您可能在我的方法中猜到的那样,PopulateYearList我得到NullReferenceException了因为我尝试添加一个ddlYears尚未构建的项目。你会建议做什么来解决这个问题?

4

2 回答 2

1

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

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

例如在页面中:

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

在用户控件中:

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

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

如果我遗漏了什么,请告诉我。

于 2012-04-10T06:31:18.477 回答
0

以太调用你PopulateYearList的. 像这样:Page_Loadusercontrol

protected void Page_Load(object objSrc, EventArgs e)
{
    if(this.IsPostBack)
      PopulateYearList()
}

或者在绑定控件时PopulateYearList public调用它pagepage

于 2012-04-10T06:38:58.327 回答