2012-11-08 144 views
0

使用VS 2010,C#.NET 3.5用戶自定義控制

我有三個用戶定義的Web控件:

控制1有一個列表框和一個按鈕

控制2有三個Text-Boxes兩個DropDownLists和三個Buttons

控件3只有一個代碼中填充的表。

我有兩個頁面:

1具有控制2和控制3

第2頁有對照1,對照2,控制3

控制2的功能完美的作品在第1頁

但是,在點擊提交按鈕時,DropDownLists總是顯示SelectedIndex = 0SelectedValue = "0"

當單擊控件2上的提交按鈕時,所有三個文本框和按鈕在兩個頁面上都保持其值。只有DropDownLists無法保留其價值。

供參考,在這裏是在提交按鈕的OnClick事件代碼:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     clsLog.WriteLog("TrainingForm.ascx - Submit."); 
     tcCategoryError.Text = " "; 
     tcDateError.Text = " "; 
     tcDescriptionError.Text = " "; 
     tcHoursError.Text = " "; 
     tcMethodError.Text = " "; 
     foreach (Control c in this.Controls) 
     { 
      LogControls(c); 
     } 
     c_iTID = Convert.ToInt32(hTID.Value); 
     c_szUserName = hUserName.Value; 
     bool bValid = true; 
     DateTime dtTrainingDate = DateTime.MinValue; 
     string szTrainingDescription = ""; 
     decimal dHours = 0M; 
     int iCategoryID = 0; 
     int iMethodID = 0; 
     if (!DateTime.TryParse(txtTrainingDate.Text, out dtTrainingDate)) 
     { 
      bValid = false; 
      tcDateError.Text = "Please Enter Valid Training Date"; 
     } 
     if (!decimal.TryParse(txtTrainingHours.Text, out dHours)) 
     { 
      bValid = false; 
      tcHoursError.Text = "Please Enter Valid Training Hours"; 
     } 
     if (this.ddlCategory.SelectedValue == "0") 
     { 
      bValid = false; 
      tcCategoryError.Text = "Please Select Training Category"; 

     } 
     else 
      iCategoryID = Convert.ToInt32(this.ddlCategory.SelectedValue); 
     if (this.ddlTrainingMethod.SelectedValue == "0") 
     { 
      bValid = false; 
      tcMethodError.Text = "Please Select Training Method"; 
     } 
     else 
      iMethodID = Convert.ToInt32(this.ddlTrainingMethod.SelectedValue); 
     if (txtTrainingDescription.Text.Trim() == "") 
     { 
      bValid = false; 
      tcDescriptionError.Text = "Please Enter Training description."; 
     } 
     else 
      szTrainingDescription = txtTrainingDescription.Text.Trim(); 
     if (bValid) 
     { 
      clsData.UpdateTraining(c_iTID, "", c_szUserName, dtTrainingDate, szTrainingDescription, iCategoryID, dHours, iMethodID); 
      TrainingID = 0; 
      ClearForm(); 
     } 
     OnEvent(new MyEventArgs(c_szUserName)); 

    } 

代碼來填充下拉菜單

protected void BindddlCategory(int iCategoryID) 
    { 
     DataTable dt = clsData.GetTrainingCategories(); 
     ddlCategory.Items.Clear(); 
     ddlCategory.AppendDataBoundItems = true; 
     ddlCategory.Items.Add(new ListItem("Select Training Category", "0")); 
     ddlCategory.DataSource = dt; 
     ddlCategory.DataTextField = "TrainingCategory"; 
     ddlCategory.DataValueField = "CID"; 
     ddlCategory.DataBind(); 
     if (iCategoryID != 0) 
      ddlCategory.SelectedValue = iCategoryID.ToString(); 
    } 
    protected void BindddlCategory() 
    { 
     BindddlCategory(0); 
    } 
    protected void BindddlTrainingMethod(int iMethodID) 
    { 
     DataTable dt = clsData.GetTrainingMethods(); 
     ddlTrainingMethod.Items.Clear(); 
     ddlTrainingMethod.AppendDataBoundItems = true; 
     ddlTrainingMethod.Items.Add(new ListItem("Select Training Method", "0")); 
     ddlTrainingMethod.DataSource = dt; 
     ddlTrainingMethod.DataTextField = "TrainingCategory"; 
     ddlTrainingMethod.DataValueField = "CID"; 
     ddlTrainingMethod.DataBind(); 
     if (iMethodID != 0) 
      ddlTrainingMethod.SelectedValue = iMethodID.ToString(); 
    } 
    protected void BindddlTrainingMethod() 
    { 
     BindddlTrainingMethod(0); 
    } 

FYI(定義控制用戶的一部分)中的DDL不在頁面加載時填充,但在顯示控件形式的事件被觸發時隱式填充:

public void ShowTrainingEntry(int iTrainingID) 
    { 
     clsLog.WriteLog("TrainingForm.ascx - ShowTrainingEntry(" + iTrainingID.ToString() + ")"); 
     hTID.Value = iTrainingID.ToString(); 
     hUserName.Value = UserName; 
     int iCategoryID = 0; 
     int iMethodID = 0; 
     if (iTrainingID != 0) 
     { 
      DataTable dt = clsData.GetTrainingRecord(iTrainingID); 
      if (dt.Rows.Count == 1) 
      { 
       txtTrainingDate.Text = Convert.ToDateTime(dt.Rows[0]["TrainingDate"]).ToString("MM/dd/yyyy"); 
       txtTrainingHours.Text = Convert.ToDecimal(dt.Rows[0]["Hours"]).ToString("N1"); 
       txtTrainingDescription.Text = dt.Rows[0]["TrainingDescription"].ToString(); 
       int.TryParse(dt.Rows[0]["CategoryCID"].ToString(), out iCategoryID); 
       int.TryParse(dt.Rows[0]["MethodCID"].ToString(), out iMethodID); 
      } 
      ShowChangeMessage(iCategoryID == 0 | iMethodID == 0); 
      ShowDeleteButton(true); 
      ShowCancelButton(true); 
     } 
     BindddlCategory(iCategoryID); 
     BindddlTrainingMethod(iMethodID); 
     tblMain.Visible = true; 
    } 

任何人對此有何想法?

感謝, 約翰

+0

你是如何填充第2頁上的DropDownList的?你能告訴我們你在哪裏填充組合框的代碼嗎? – dash

回答

0

如果要動態地添加用戶控件的,你需要確保他們不遲比Page_Init添加。這是當頁面試圖設置PostBack中的值時存在的控件。

+0

我不是。用戶控件在設計時放置在頁面上(即在.aspx頁面而不是aspx.cs頁面中)。 – John

+0

您聲明:_不在頁面加載時填充DDL,但在顯示控件形式的事件爲fired_時隱式填充DDL。 init值之前是否存在**值?或者在之後是否添加**值? –