2012-12-23 89 views
0

在創建一個調查頁面時,此頁面從數據庫中拉出以顯示基於它們類型的問題。對於每種類型,我創建了一個用戶控件。在Page_Load,我把在這樣的佔位符的用戶控件: - (俠諾是一個會話我設置爲0,前一個頁面上,只是爲了啓動問題順序)在動態創建的用戶控件中從文本框中檢索文本

protected void Page_Load(object sender, EventArgs e) 
     { 

      SqlConnection Connection = DatabaseConnection.GetSurveySystemConnection(); 

      string sqlquery = "SELECT Q.[ID], Q.[Question_Order], Q.[Question], QT.[Type_Desc] FROM [Questions] Q Inner join Question_Type QT On Q.Type_ID= QT.ID Where Q.[Survey_ID] =" + Session["Survey_ID"] + "Order by Question_Order"; 

      SqlCommand cmd = new SqlCommand(sqlquery, Connection); 
      cmd.CommandType = CommandType.Text; 
      SqlDataAdapter da = new SqlDataAdapter(); 
      da.SelectCommand = cmd; 
      DataTable DT = new DataTable(); 
      da.Fill(DT); 

      if (DT != null) 
      { 
       Session["Count"] = DT.Rows.Count; 
       QuestionLabel.Text = String.Format("{0}.{1}", DT.Rows[Convert.ToInt32(Session["QNO"])]["Question_Order"].ToString(), DT.Rows[Convert.ToInt32(Session["QNO"])]["Question"].ToString()); 
       Session["Question_ID"] = DT.Rows[Convert.ToInt32(Session["QNO"])]["ID"].ToString(); 

       if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Multiple Choice") 
       { 
        Control uc = Page.LoadControl("UserControls/MultipleChoice.ascx"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
       else if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Single Choice") 
       { 
        Control uc = Page.LoadControl("UserControls/SingleChoice.ascx"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
       else if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Yes/No") 
       { 
        Control uc = Page.LoadControl("UserControls/YesOrNo.ascx"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
       else if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Agree/Disagree") 
       { 
        Control uc = Page.LoadControl("UserControls/AgreeDisagree"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
       else if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Rating") 
       { 
        Control uc = Page.LoadControl("UserControls/Rating.ascx"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
       else if (DT.Rows[Convert.ToInt32(Session["QNO"])]["Type_Desc"].ToString() == "Open Ended") 
       { 
        Control uc = Page.LoadControl("UserControls/OpenEnded.ascx"); 
        PlaceHolder2.Controls.Add(uc); 
       } 
      } 
     } 

現在,讓我們說的類型「Open Ended」,它在usercontrol中顯示一個文本框,我想訪問這個文本框並且檢索它裏面的文本,並按下一個按鈕將它放在另一個文本框中,我在頁面上創建了一個靜態文本框,並將其命名爲ViewTextBox 。 這是我試過的: -

protected void Button1_Click(object sender, EventArgs e) 
      { 
    TextBox t = Controls[0].Controls[3].Controls[11].Controls[5].Controls[0].Controls[0] as TextBox; 
    ViewTextBox.Text = t.Text; //"Object reference not set to an instance of an object." 
      } 

任何想法?我挖我的方式,通過頁面上的控制,以發現在用戶控件的文本框: -

Response.Write(Controls[0].Controls[3].Controls[11].Controls[5].Controls[0].Controls[0].ID); 

和ID出現的文本即時尋找。在用戶控件的文本框被稱爲「OpenEndedTextBox」

回答

0

不用去挖這樣,我建議建立一個Method or Property in your user control來獲取文本從用戶控件這樣

public string GetAnsweredText() 
{ 
    return this.AnswerTextBox.Text; 
} 

,並調用這個方法在你的按鈕的在你的頁面點擊事件包含這樣

protected void Button1_Click(object sender, EventArgs e) 
{ 
    UC_SurveyControl control = this.Controls[0] as UC_SurveyControl; 
    if (control != null) 
     string answer = control.GetAnsweredText(); 
} 
+0

你能告訴我爲什麼我得到「對象引用未設置爲對象的實例」。那條線上的錯誤? –

+0

@ BasharAl-Khalili最有可能您試圖找到的控件不存在於您試圖從中獲取的索引處。這就是爲什麼我建議您創建該方法,以便您不必遍歷這些索引。 – yogi

0

用戶控制,我建議你在這裏使用遞歸這可能不是最好的性能解決方案,但它是完美的作品。

這個應該用在Page_PreRender()事件中。

public static T FindControlRecursive<T>(Control sourceControl, string targetControlId) 
    where T : class  
{  
    if (sourceControl == null)  
    throw new ArgumentNullException("sourceControl");  
    if (targetControlId == null)  
    throw new ArgumentNullException("targetControlId");  
    if (sourceControl.ID == targetControlId) return sourceControl as T;  
    foreach (Control control in sourceControl.Controls)  
    {  
    T controlToReturn = FindControlRecursive<T>(control, targetControlId);  
    if (controlToReturn != null) return controlToReturn as T;  
    }  
    return null;  
} 

Si vis pacem DotNetnum。