2

user control私は3つを保持するウェブを持っていますdropdownlists:1つは日を保持し、2つ目は月を保持し、3つ目は年を保持します。日と月は静的ですが、年の項目は、間違った年を入力しないようにする必要がある場合に変更されます。最初に私が順番に行うことをここにリストし、次に質問をします。

  1. 私はプライベートintyearSpanを持っています。
  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() 
    }
}

親ページからそのコントロールに変更を加えない限り、コントロールの後のイベントは load で、this.PopulateYearList を呼び出すことができます。誰かがページから値を変更したかのように、PreRender イベントでそれを呼び出しました。これは、最後にユーザー コントロールの値によってオーバーライドされるため、値が調整されていないと確信しています。

何か不足している場合はお知らせください。

于 2012-04-10T06:31:18.477 に答える
0

Ether は、PopulateYearListの を呼び出しPage_Loadますusercontrol。このような:

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

または、コントロールをバインドするときに を作成しPopulateYearList publicて呼び出すpagepage

于 2012-04-10T06:38:58.327 に答える