【问题标题】:Retrieving Text from Textbox in dynamically Created UserControl从动态创建的用户控件中的文本框中检索文本
【发布时间】:2012-12-23 06:15:59
【问题描述】:

我正在创建一个调查页面,此页面从数据库中提取以根据其类型显示问题,对于每种类型,我都创建了一个用户控件。在Page_Load,我将用户控件放在这样的占位符中:-(QNO 是我在上一页设置为 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”

【问题讨论】:

    标签: c# asp.net sql-server-2012


    【解决方案1】:

    我建议不要像那样挖掘,而是创建一个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();
    }
    

    【讨论】:

    • 你能告诉我为什么我得到“对象引用未设置为对象的实例。”那行有错误吗?
    • @BasharAl-Khalili 您尝试查找的控件很可能在您尝试从中获取它的索引中不存在。这就是为什么我建议您创建该方法,这样您就不必发现它遍历这些索引。
    【解决方案2】:

    我建议您在这里使用递归,它可能不是最好的性能解决方案,但它可以完美运行。

    这应该在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 vispacm DotNetnum.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      相关资源
      最近更新 更多