PDA

View Full Version : سوال: دسترسی به TextBox های ایجاد شده در Runtime



amirhacker
شنبه 25 دی 1389, 15:14 عصر
با سلام خدمت تمامی عزیزان
من چند وقته (1-2 هفته) به مشکل برخوردم اگه میشه کمک کنید
من اومدم تو فرمم چند تا لیبل و تکست باکس به صورت Run Time ایجاد کردم
حالا مشکلی که دارم اینه که میخام Textبه تکست باکسم دسترسی داشته باشم ( در رویداد Btn_Click)
هر کاری به ذهنم میرسید انجام دادم اما نتیجه نگرفتم
نکته1 : به ID , بیشتر متدها دسترسی دارم به غیر Text حتی میتونم هر کدوم از تکست باکسهای runTime را خاموش و روشن کنم (Visible )
لطف بفرمایید و راهنمایی کنید
نکته 2 : زبان C#- Asp.net
نکته 3 : کنترل تکست باکسها داخل Cell یک Table ایجاد میشه که اونم به صورت RunTime ایجاد میشه
اگه لازمه کدشو میذارم

Javad_Darvish_Amiry
شنبه 25 دی 1389, 15:56 عصر
دوست عزیز من متوجه سوالتون نشدم. میفرمایید میخواید به کنترلتون دسترسی داشته باشید، از طرفی هم میفرمایید که میتونید اونها رو خاموش و روشن (Visible) کنید. دیگه چه دسترسی ای میخواید؟ اگه ممکنه بیشتر توضیح بدید؛ کدتون هم اگه باشه خیلی بهتره.

amirhacker
شنبه 25 دی 1389, 17:26 عصر
درود بر شما دوست عزیز
من به کنترل دسترسی دارم اما وقتی میخام مثلا txt_1.Text را Insert کنم تو DB میگه که متد Text براش تعریف نشده
در یک کلام میخام به text تکست باکسی که در حالت RunTime ایجاد شده دسترسی داشته باشم (اطلاعاتی که کاربر در تکست باکس وارد میکنه)

Javad_Darvish_Amiry
شنبه 25 دی 1389, 23:07 عصر
اگه ممکنه کدتون رو ببینم؛ اون قسمت های اصلی که تکست باکس ایجاد میشه، و جای که میخواید بهش دسترسی داشته باشید کفایت میکنه. (واقعیتش من هنوز نگرفتم؛ البته ببخشید)

mehrdad201
یک شنبه 26 دی 1389, 01:10 صبح
شما فرمودید میتونید به خود کنترلها دسترسی داشته باشید و اونها رو hide یا show کنید

اما به text دسترسی ندارید.

من این حس رو دارم که شما وقتی دکمه رو فشار میدید تا text رو بخونید. از اونجاییکه page cycle از صفر شروع میشه و textbox ساخته شده دوباره از نو ایجاد میشه چون مقدار نداره شما با string.empty مواجه میشید.

البته مطمئن نیستم برداشت من درست باشه. نمیدونم ایا وقتی در runtime یه کنتزل اضافه میشه view state هم اتوماتیک براش در نظر گرفته میشه یا نه !!!

یکبار برنامه رو دیباگ کنید و مراحل رو خط به خط برید جلو. در ضمن موقعی که کنترل رو در runtime ایجاد میکنید خاصیت view state رو هم true کنید ببینید چی میشه.

--------------
اینها که گفتم ممکنه درست نباشه. بهتره اساتید دیگه هم نظر بدن. اما به نظرم بهترین کار دیباگ خط به خط برنامه هست

Javad_Darvish_Amiry
یک شنبه 26 دی 1389, 01:52 صبح
ایا وقتی در runtime یه کنتزل اضافه میشه view state هم اتوماتیک براش در نظر گرفته میشه یا نه !!!
اگه ViewState رو برای صفحه فالس نکرده باشن (که بعید میدونم کرده باشن) بله در نظر گرفته میشه. من هم اول مثل شما فکر کردم؛ ولی با توجه به نوشته شون (میگه که متد Text براش تعریف نشده) فکر میکنم (البته فقط فکر میکنم - حدس میزنم، شاید درست نباشه) اشکال تایپی یا یه همچین چیزی باشه. باید کد دیده شه به نظرم.

mehrdad201
یک شنبه 26 دی 1389, 11:01 صبح
والا شیئی که از نوع تکست باکس تعریف میشه و add میشه به صفحه باید همه متدها و پراپرتی هاش رو داشته باشه !! منهم فکر مکینم ایشون یه اشتباه کوچولو کرده

دوست عزیز بیا نتیجه رو اعلام کن لطفا

amirhacker
یک شنبه 26 دی 1389, 13:33 عصر
سلام و درود بر شما عزیزان
ممنون که نظر دادید
من کدمو تو ضمیمه گذاشتم
بازم ممنون میشم اگه راهنماییم کنید

Javad_Darvish_Amiry
یک شنبه 26 دی 1389, 14:28 عصر
البته کدتون رو تو Notepad باز کردم و خیلی ازش سر در نیاوردم؛ ولی فکر میکنم اگه متود Button1_Click رو به شکل زیر تغییر بدید، درست میشه. الان دیرمه، شب دلیلش رو براتون توضیح میدم. (البته اگه درست فهمیده باشم اشکال از کجاست، شاید کلا اصلا نفهمیده باشم.)


protected void Button1_Click(object sender, EventArgs e) {
TextBox t = table.Rows[0].Cell[0].FindControl("txt_1") as TextBox;
if (!Object.ReferenceEquals(null, t)) {
// your codes
param[1] = new SqlParameter("@DetailCode1", t.Text);
// another codes
}
}

فعلا شرمنده. موفق باشید.

amirhacker
یک شنبه 26 دی 1389, 15:20 عصر
خیلی ممنون
زحمت کشیدید
شب که رفتم خونه تست میکنم خبرشو میدم
انشا ا... موفق باشی

mehrdad201
یک شنبه 26 دی 1389, 17:10 عصر
اقا امیری

این کد


if (!Object.ReferenceEquals(null, t))با


if (t != null)
چه فرقی داره

Javad_Darvish_Amiry
یک شنبه 26 دی 1389, 18:10 عصر
هیچ فرقی دوست من؛ از نظر عملکرد (در مورد Refrence Type ها) دقیقا یکسانند؛ فقط اولی یادمون میندازه که داریم مرجع تو تا شیئ را با هم قیاس میکنیم، نه مقادیرشون رو؛ به نظرم این طوری هم دقت کدنویسیمون بالا میره و هم هر لحظه حواسمون هست که OOP!!!
مثل این که میگن یه لحظه هم از یاد مرگ غافل نشین. (محض خنده بود، بحث خیلی هم خشک خوب نیست :لبخندساده:)

amirhacker
دوشنبه 27 دی 1389, 08:41 صبح
سلام
آقای Javad_Darvish_Amiry (http://barnamenevis.org/member.php?165273-Javad_Darvish_Amiry) دستت درد نکنه
منو یه جورایی نجات دادید
انشا ... خیر دنیا و آخرت ببینی جوون
واقعا کمکم کردی
حالا اگه میشه دلیل این کار را هم بگی ممنون میشم

Javad_Darvish_Amiry
دوشنبه 27 دی 1389, 14:46 عصر
دوست عزیز، متود FindControl چیزی که بهتون برمیگردونه یه Control هست؛ (کلاسی که همه کنترل های ASP.NET از اون مشتق میشن)؛ چون این متود قراره یه متود عمومی باشه که روی هر چیزی کار کنه و بتونه هر کنترلی رو پیدا کنه، برای همین کلاس پایه کنترل ها رو به عنوان خروجی بعد از پیدا کردن کنترل مورد نظر بر میگردونه. بنابراین شما تو اون کدهایی که نوشته بودین، (هر چند درست بود) خروجی یه Control داشتید نه یه TextBox. خوب Control اعضایی مثل Visible رو داره، (که شما هم فرمودید کار میکنه) اما عضوی مثل Text رو نداره، چون اگه این عضو رو داشت اونوقت دیگه مثلا یه کنترلی مثل Panel یا GridView نمیشد ازش ارث ببرن (چون اساسا صفت Text برای همچین کنترل هایی معنی نداره). عضو Text وقتی بهش اضافه شد (به خودش نه، به بچه اش) که با کلاس TextBox توسعه داده شد. بنابراین شما برای این که بتونید از این صفت استفاده کنید، باید شیئ Controlی که از این متود به دست میارید رو تبدیل کنید به یه شیئ TextBox. (این کارو بهش میگن costing). تو costing یه شیئ از یه نوع (Type) خاص به یه نوع خاص دیگه تبدیل میشه. اگه بخوایم خیلی ریز بشیم، وقتی متود FindControl این کنترل رو پیدا کرده، در واقع یه TextBox رو پیدا کرده، اما به همون دلیل عمومیت اونو به عنوان (باز هم costing) یه Control بر گردونده. (هر چند خودش درکی از این موضوع نداره و در واقع دریافتش یه Control هست نه یه TextBox یا هر چیز دیگه). پس چیزی که تو حافظه وجود داره TextBox ماست، اما چیزی که تو ارجاع وجود داره، یه Control. حالا ما با کاست کردن میایم ارجاع رو از Control به TextBox تغییر میدیم. بنابراین حالا با یه TextBox واقعی طرفیم که متود به خاصیت Textش دسترسی داشته باشیم. (البته برعکس هم میشه، یعنی کاست از جزء به کل که در این صورت بعضی خواص هر چند وجود دارند، اما مقداری ندارن یا اگه اول داشتن و چندین مرحله کاست شده، مقدارشون رو از دست دادن) کاستینگ به دو صورت اتفاق میفته که در این جا نوع کاستینگ اتفاق افتاده رو میگن کاست صریح. چون ما صراحتا و به روشنی و شفافیت یه Control رو به یه TextBox تبدیل میکنیم، با این کد:


TextBox t = (TextBox)table.Rows[0].Cell[0].FindControl("txt_1");

یعنی چی؟ یعنی با متود مربوطه کنترل رو پیدا میکنیم، (تا این جا چیزی که داریم یه Control هست) بعد قبل از این که اونو به متغیر سمت چپ (t) نسبت بدیم (یادمون نرفته که = عملگر انتساب هست و اولویت اجراش از سمت راست، یعنی اول باید تمام محاسبات سمت راست عبارت تموم بشه، بعد حاصل تو متغیر سمت چپ ریخته شه) میام با اون پرانتزی که گذاشتیم و توش نوشتیم TextBox شیئ به دست اومده رو به یه TextBox تبدیل میکنیم. بعد میریزیمش تو t. تا این جا کدمون کامله و حالا میشه با t کار کرد و مثلا مقدار Textش رو خوند.
اما...
من این کارو نکردم، چرا؟ به خاطر این که: وقتی مت داریم کاست صریح با عملگر پرانتز انجام میدیم، از دات نت میخوایم هر چیزی که جلوی پرانتز بود (در این جا کنترلی که با FindControl پیدا کردیم و تایپش Control هستش) رو به چیزی که توی پرانتز هست تبدیل کنه.
تو شرایط عادی هیچ اشکالی نداره؛ اما دو جا مشکل ساز میشه: 1- وقتی شیئ تبدیل شونده قابلیت تبدیل به شیئ مقصد رو نداشته باشه. (مثلا نمیشه یه FileStream رو به یه MembershipUser تبدیل کرد!!!) تو این شرایط سیستم با پرتاب (throw) یه خطا-استثناء (Exception) متوقف میشه. (یا میشه اینجوری هم گفت: شیئ مقصد توانایی میزبانی شیئ مبدا رو نداره. این درست تره چون عمل کاستینگ در واقع تبدیل نیست، بلکه میزبانیه). 2- وقتی شیئ مبدا null باشه. مثلا تو کاربرد شما، وقتی کنترل پیدا نشه. تو این شرایط چون ما خواستیم حتما تبدیل (میزبانی) صورت بگیره، و از طرفی null امکان تبدیل به شیئ TextBox (و یا هر شیئ دیگری) رو نداره باز با یه Exception مواجه میشیم. برای رهایی از این موضوع، عمل کاستینگ رو با کلمه کلیدی as انجام میدیم. اینطوری میگیم: آقا جان این شیئ رو پیدا کن، بعد اگه تونستی تبدیلش کن به این یکی نوع. (میزبانیش کن تو این یکی نوع). اگه منونستم چی؟ عیبی نداره null بهم بده. حالا توی t یا یه TextBox داریم که پیدا شده (همونی که میخواستیم) یا یه ارجاع از نوع TextBox ولی به هیچ چی (null) داریم. چقدر خوب!!! حالا کافیه موقع استفاده از t چک کنیم که null نباشه، همونکاری که بالا انجام دادیم.
موفق باشید دوست محقق من.

amirhacker
دوشنبه 27 دی 1389, 14:57 عصر
سلام
بسیار عالی - دقیق و شیوا بود
دستت درد نکنه
اگه بازم مشکل داشتم مزاحمتون میشم