web-dev-qa-db-ja.com

ASP.NET DropDownListがポストバックで選択されたアイテムを保持しない

ASP DropDownListがPage_Loadイベントに読み込まれます。項目を選択してボタンを押すと、選択された項目がクリアされ、DropDownListの最初の項目が選択されます(DropDownListはページがポストバックでない場合にのみ入力されます)

助けてください

   if (!IsPostBack)
    {
            List<Country> lCountries = new List<Country>();
            List<CompanySchedule> lCompanySchedules = new List<CompanySchedule>();
            this.Load_Countries(lCountries);
            this.Load_Schedules(lCompanySchedules);
            if (personnelRec == null)
            { personnelRec = new Personnel(); }
        if (Request.QueryString["UA"] != null && Convert.ToInt32(Request.QueryString["UA"].ToString()) > 0)
        {
            userAccount.ID = Convert.ToInt32(Request.QueryString["UA"].ToString());
            App_Database.Snapshift_Select_Helper.SNAPSHIFT_SELECT_PERSONNEL_APP_ACCOUNT(ref userAccount);
        }
            this.imgEmployeePicture.ImageUrl = "./images/Employees/nophoto.gif";
            if (Request.QueryString["EI"] != null && Convert.ToInt32(Request.QueryString["EI"].ToString()) > 0)
            {
                this.Load_PersonnelRec(Convert.ToInt32(Request.QueryString["EI"].ToString()));
            }
            else
            {
                this.lblChangeDirectionHead.Enabled = false;
                this.lblChangeDirections.Enabled = false;
                this.lbSchedules.Disabled = true;
            }
    }
16
mattgcon

ページのライフサイクルは次のことを行います(加えて、質問に関係のない他のステップ)。

  1. OnInit
  2. ViewStateからコントロールを入力します(ポストバック中)。
  3. 選択した値を設定する(ポストバック中)
  4. _Page_Load_

アイテムを「選択」する前にリストに入力できるように、ViewStateを有効にする必要があります。この場合、Page_Loadに再入力して選択した値を失わないようにしてください。 if (!IsPostback) { // Populate }のようなことをしてください

それ以外の場合は、すべてのページリクエストでOnInitイベントにリストを手動で入力する必要があります。 _Page_Load_はライフサイクルが遅すぎるため、選択したアイテムは失われます。

編集:

DropDownListにも有効な値を設定する必要があります(ブラウザーに表示されるテキストとは別)。これはDataValueFieldプロパティを通じて行われます。各値は一意である必要があります。一意でない場合は、最初の重複アイテムのみが選択されます。ブラウザでHTMLソースを見ると、次のものが必要です。

_<select>
    <option value="unique_value1">Displayed text1</option>
    <option value="unique_value2">Displayed text2</option>
</select>
_

一意の値は、サーバー側で適切なアイテムを選択するために使用されます。

36

マスターページを使用していますか?その場合は、マスターページで必ずEnableViewStateをtrueに設定してください。