[英]Retrieving Text from Textbox in dynamically Created UserControl
我创建了一个调查页面,此页面从数据库中拉出以根据问题的类型显示问题。对于每种类型,我都创建了一个用户控件。 在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”
建议不要Method or Property in your user control
创建Method or Property in your user control
而不是像这样进行挖掘,这样就可以从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();
}
我建议您在此处使用递归,它可能不是最佳性能解决方案,但它可以完美工作。
应该在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;
}
相对于DotNetnum。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.