PDA

View Full Version : مشکل در دسترسی به کنترلهای داخل Usercontrol



anahita_s
چهارشنبه 23 آبان 1386, 17:26 عصر
با سلام

من از usercontrol در برنامم استفاده کردم، این usercontrol شامل تعدادی textbox در داخل panel هست. برای ایجاد uc ها از کد زیر استفاده می کنم.



protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
for (int i = 0; i < 3; i++)
{
Control ucCategory = LoadControl("UcCategoryInfo.ascx");
Panel pnlCategory = (Panel)ucCategory.FindControl("pnlCategoryInfo");
ucCategory.ID = "ucCategory" + i;
pnlCategory.GroupingText = "ucCategory" + i];
MainTD.Controls.Add(ucCategory);
}

}


من می خوام در کلیک یک button به مقادیر textbox های داخل uc دسترسی پیدا کنم.



protected void btnRecordHotelInfo_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3; i++)
{
Control uc = (Control)this.FindControl("ucCategory" + i);
***Panel pnl = (Panel)uc.FindControl("pnlCategoryInfo");
TextBox t = (TextBox)pnl.FindControl("txtPrice");
}

}


اما panel داخل uc رو نمی تونم بهش دسترسی داشته باشم و در خطی که در کد بالا با *** مشخص کردم خطایSystem.NullReferenceException رو میده.

با تشکر

Chabok
پنج شنبه 24 آبان 1386, 09:15 صبح
سلام
شما که نصف راه شی گرایی رو اومدین بقیش رو هم شی گرا ادامه بدین .
برای هر ویژگی از هر کنترل خودتون که میخواهید تغییر بدین در یوزر کنترلتون یک Property ایجاد کنید تا از طریق همین یوزر کنترل مقادیر خودتون رو دستکاری کنید .

مثلا اگر در یوزر کنترل تسکت باکس دارین و می خواهید مقدارش رو تغییر بدین یک Property مثلا به عنوان TBText ایجاد کنید و هنگام Set مقدار Value رو به Textbox خودتون بدین و هنگام Get هم مقدار Text تکست باکستون رو برگردونید .

با انجام این مراحل شما به این صورت میتوانید از خاصیت text همون TextBox استفاده کنید

MyUserControl.TBtext = "Salam" ;
این راه خیلی بهتر از راهی است که رفتین .
موفق باشید . خدانگهدار

anahita_s
پنج شنبه 24 آبان 1386, 15:57 عصر
با سلام

من حتی برای کد ساده زیر که ایجاد دینامیک یک textbox هست همین مشکل رو دارم.



public partial class DynamicTxt : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
TextBox dynamicTbox= new TextBox();
dynamicTbox.ID = "txtName";
maintd.Controls.Add(dynamicTbox);
}
protected void Button1_Click(object sender, EventArgs e)
{
TextBox newTbox = (TextBox)this.FindControl("dynamicTbox");
string strName = newTbox.Text;
Response.Write(strName);

}
}




خطا در line:23:



Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 21: {
Line 22: TextBox newTbox = (TextBox)this.FindControl("dynamicTbox");
Line 23: string strName = newTbox.Text;
Line 24: Response.Write(strName);
Line 25:


با تشکر

SalarSoft
پنج شنبه 24 آبان 1386, 17:58 عصر
کنترل ها رابطه پدر فرزندی رو به شدت رعایت میکنند
کد خودتون رو اینطوری اصلاح کنید:


public partial class DynamicTxt : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
TextBox dynamicTbox= new TextBox();
dynamicTbox.ID = "txtName";
maintd.Controls.Add(dynamicTbox);
}
protected void Button1_Click(object sender, EventArgs e)
{
TextBox newTbox = (TextBox)maintd.FindControl("dynamicTbox");
string strName = newTbox.Text;
Response.Write(strName);

}
}


مورد اول هم همینطور، کنترل ucCategory شما در داخل MainTD قرار داره.


protected void btnRecordHotelInfo_Click(object sender, EventArgs e)
{
for (int i = 0; i < 3; i++)
{
Control uc = (Control)MainTD.FindControl("ucCategory" + i);
Panel pnl = (Panel)uc.FindControl("pnlCategoryInfo");
TextBox t = (TextBox)pnl.FindControl("txtPrice");
}
}

anahita_s
شنبه 26 آبان 1386, 21:20 عصر
با سلام

از اینکه برای مشکل من وقت صرف کردید واقعا ممنون

مشکل من مربوط بهIsPostBack! بود که برای کنترلهای RunTime نباید استفاده شود، و اینکه برای findکردن usercontrol باید از ID مربوط به خود usercontrol و از IDمربوط به td همانطور که جناب SalarSoft اشاره کردند استفاده می‌کردم.

باتشکر