PDA

View Full Version : چگونگی دسترسی به کنترل های فرم های دیگر



samprp
شنبه 17 شهریور 1386, 11:25 صبح
سلام
من دو تا فرم دارم و در فایل program.cs یک نمونه از Form1 با استفاده از کد
Application.run()
اجرا شده (به صورت اتوماتیک) و من در form2 هستم ولی نمی تونم به کنترل های فرم دیگر (فرم 1 ) دسترسی داشته باشم .
این کد هم خطا می ده :
form1.button1.text
و می گه که button1 تعریف نشده .
با تشکر .

gomnam
شنبه 17 شهریور 1386, 12:49 عصر
سلام
من دو تا فرم دارم و در فایل program.cs یک نمونه از Form1 با استفاده از کد
Application.run()
اجرا شده (به صورت اتوماتیک) و من در form2 هستم ولی نمی تونم به کنترل های فرم دیگر (فرم 1 ) دسترسی داشته باشم .
این کد هم خطا می ده :
form1.button1.text
و می گه که button1 تعریف نشده .
با تشکر .

روی مطالب OOP مطالعه کنید
اصلا درست نیست که بخواین از یه فرمی به کنترل های یه فرم دیگه دست رسی پیدا کنین چون همه چیز مخصوصا encapsolatio که اساس شی گرایی هستش زیر سوال میره
شما باید داده هاتون را بین فرم های مختلف به اشتراک بذارین نه خود آبجکت ها را
برای این کار هم راه های متفاوتی مجود داره
یکی از بهترین و مطمئن تریم راه ها استفاده از property هست
به مثال زیر توجه کن

PC2st
شنبه 17 شهریور 1386, 14:57 عصر
این کد هم خطا می ده :
form1.button1.text
و می گه که button1 تعریف نشده .
اگر form1 تعریف شده، بصورت زیر بنویسید:


form1.Controls["button1"].Text

gomnam
شنبه 17 شهریور 1386, 15:38 عصر
اگر form1 تعریف شده، بصورت زیر بنویسید:


form1.Controls["button1"].Text


به دلایلی که در پست دوم گفته شد و البته خیلی دلایل دیگه که تحقیق راجع به اونا را به خودتان ارجاع میدم این کار اصلا درست نیست

PC2st
شنبه 17 شهریور 1386, 16:02 عصر
به دلایلی که در پست دوم گفته شد و البته خیلی دلایل دیگه که تحقیق راجع به اونا را به خودتان ارجاع میدم این کار اصلا درست نیست
این کار دسترسی Dynamic گفته میشه و هیچ منافاتی با OOP و کپسوله بودن نداره.
دلایل رو ذکر کنید تا روی این مورد مفصلا بحث کنیم.

rasoul_ras
یک شنبه 18 شهریور 1386, 10:28 صبح
این کار دسترسی Dynamic گفته میشه و هیچ منافاتی با OOP و کپسوله بودن نداره.
دلایل رو ذکر کنید تا روی این مورد مفصلا بحث کنیم.

این کاری شما اسمش رو Dynamic گذاشتید و خوشحال می شم منبع شو بدونم
type Safe نیست ....!!!!!!!!!!!!!!

فرض کنید که نام button 1 در دیزاینر تغییر بدید انوقت به مشکل خواهید شد

و این اصلا مناسب نیست که .

PC2st
یک شنبه 18 شهریور 1386, 11:31 صبح
این کاری شما اسمش رو Dynamic گذاشتید و خوشحال می شم منبع شو بدونم
type Safe نیست ....!!!!!!!!!!!!!!
امن بودن یا امن نبودن یک کد رو، برنامه نویس باید تعیین کنه، این کد ممکنه در جایی ناخوشایند و در جایی خیلی کارآمد به نظر برسه.
Dynamic یعنی پویا :-) یعنی بصورت پویا (غیر ثابت و متحرک) میشه به کنترلهای فرم دسترسی داشت، همانطور که بصورت پویا (Dynamic) به داده های یک ArrayList یا item های یک ComboBox میتونید دسترسی داشته باشید. آیا دسترسی به Item های یک ComboBox، خلاف OOP است؟ یا غیر امن است؟
کلاس Form از جهاتی میتونه شبیه به یک ComboBox باشه، یعنی به item های (کنترلهای) یک Form میتوان دسترسی داشت، همانطور که به item های یک combo box دسترسی دارید. اینکه میتوان به کنترلهای روی From بصورت یک package دسترسی داشته باشید، بستگی به روش طراحی کلاس Form داره یعنی اینکه در کلاس Form در دات نت فریم ورک، یک کلاس Form با این قابلیت ایجاد شده که بشه به این شکل به کنترلهاش دسترسی داشت. در واقع کلاس From یک Collection از کنترلهای فرم رو در اختیار برنامه نویس قرار میده.




فرض کنید که نام button 1 در دیزاینر تغییر بدید انوقت به مشکل خواهید شد
در حالتی که بخوایم از نام button1 بصورت یک شیئ استفاده کنیم، مثلا button1.Text، اگر نام button1 رو به button2 تغییر بدیم، آیا مشکلی پیش نمیاد؟ مشکل پیش خواهد آمد ولی VS.NET این مشکل رو با replace کردن نام button1 به button2 حل میکنه و کار برنامه نویس رو راحت میکنه.




و این اصلا مناسب نیست که .
بستگی داره که میخوایم چکار کنیم؟ بله، این روش که همیشه روش مناسبی نیست! و در مواقعی که احتیاج به آن باشد، بهتره ازش استفاده کرد (بستگی به این داره که میخوایم چیکار کنیم).

rasoul_ras
یک شنبه 18 شهریور 1386, 13:38 عصر
واقعا بهتر یک مقدار مطالعات ر و بیشتر کنید
در ضمن منبع حرفتون رو نگفتید این یک ایده من در آوردیست یا یک ایده ثبت شده ؟؟؟؟؟؟

در ضمن از عزیزانی که به oop و برنامه نوبسی اصولی آشنایت دارند کمک می خواهم که به این فرد بفهماند که این type Safe ,.... یعنی چه ؟؟

عاجزانه از شما می خواهم چون تاپیک های فراوانی هست که این چنین جواب های
بزن بروئی در آنها وجود دارد.

انجمن حمایت از برنامه نویسان خوب !!!!


بستگی داره که میخوایم چکار کنیم؟ بله، این روش که همیشه روش مناسبی نیست! و در مواقعی که احتیاج به آن باشد، بهتره ازش استفاده کرد (بستگی به این داره که میخوایم چیکار کنیم).

ما می خواهیم برنامه نویسی درست انجام بدیم ....

PC2st
یک شنبه 18 شهریور 1386, 15:52 عصر
واقعا بهتر یک مقدار مطالعات ر و بیشتر کنید
در ضمن منبع حرفتون رو نگفتید این یک ایده من در آوردیست یا یک ایده ثبت شده ؟؟؟؟؟؟
من این واژه رو از یک منبع خاصی نگفتم، بهرحال اگر دنبال سایت خارجی میگردید،
http://www.dotnetspider.com/kb/Article1045.aspx
لینک فوق برای ASP.NET است. در مورد ساخت و نحوه دسترسی dynamic به کنترلها، توضیحاتی داده شده و توجه کنید که در آخرین مثال در آن لینک، از حلقه foreach و خاصیت Controls برای دسترسی به کنترلها استفاده کرده است. به واژه های dynamic هم که در آن لینک به کار رفته، دقت کنید.




کمک می خواهم که به این فرد بفهماند که این type Safe ,.... یعنی چه ؟؟
ظاهرا حرف های من مورد قبول نیست :-) این هم یک لینک خارجکی، اگر خواستید بخونید.
http://www.exforsys.com/tutorials/csharp/.-net-type-safety.html



نمیدونم چرا حس میکنم نمیخواهید یک بحث سالم صورت بگیره، بهرحال اگر بحث بخواد اینگونه ادامه پیدا کنه (به شیوه نگارشی که در پستهاتون میبینم) مسلما شرکت در این بحث، برای من خوشایند نخواهد بود.

mehdi.mousavi
یک شنبه 18 شهریور 1386, 16:29 عصر
در حالتی که بخوایم از نام button1 بصورت یک شیئ استفاده کنیم، مثلا button1.Text، اگر نام button1 رو به button2 تغییر بدیم، آیا مشکلی پیش نمیاد؟ مشکل پیش خواهد آمد ولی VS.NET این مشکل رو با replace کردن نام button1 به button2 حل میکنه و کار برنامه نویس رو راحت میکنه.

سلام.
همونطور که rasoul_ras نوشتن، این نوع کد نوشتن type-safe نیست. وقتی شما به کنترلی به ترتیب توضیح داده شده دسترسی پیدا کنید، و سپس نام اون کنترل رو تغییر بدین، کامپایلر هرگز نمیتونه عمل Refactoring رو در مورد چنین دسترسیهایی بررسی کنه. در نتیجه برنامه نویس مجبور هست به یاد نگه داره که هنگام تغییر نام متغییر، باید Find All کنه و کلیه نوشته های مشابه رو بررسی کنه که آیا باید دستی تغییر نام پیدا کنن یا خیر.

این مساله در مورد کنترلهایی که بصورت Dynamic ایجاد میشن وجود نداره، چون چنین کنترلهایی در Runtime ایجاد شدن و طبیعتا تغییر نام پیدا نخواهند کرد. در نتیجه type-safe بودن اونها بی معنی خواهد بود.

rasoul_ras
یک شنبه 18 شهریور 1386, 16:29 عصر
عزیزم :
من کد مربوطه در لینک که شما معرفی کردی مطالعه کردم
اگر بیشتر به آن دقت کنی میبینی که ساخت کنترلها در زمان ران تایم و به صورت Dynamically
بوده نه دسترسی به آنها .

در ضمن این کار را روی کنترلهای انجام داده که در زمان اجرا ساخته شد اند

و این کد


foreach (Control child in parent.Controls)
{
if (child is System.Web.UI.WebControls.TextBox
&& child.ID.IndexOf("txt_") == 0)
{
TextBox textbox = (TextBox)child;
textbox.Text = "You Got It !";
}

if (child.Controls.Count > 0)
{
IterateControls(child);
}
}

با این کد خیلی متفاوت


form1.Controls["button1"].Text
در همه این حالات این کار type safe نیست .......؟؟؟!!1:اشتباه::اشتباه::اش باه::اشتباه:


در ضمن معذرت می خوام عصبانی شدم وقتی دیدم بر اشتباهی پا فشاری مشود.... .

PC2st
یک شنبه 18 شهریور 1386, 18:20 عصر
همونطور که rasoul_ras نوشتن، این نوع کد نوشتن type-safe نیست. وقتی شما به کنترلی به ترتیب توضیح داده شده دسترسی پیدا کنید، و سپس نام اون کنترل رو تغییر بدین، کامپایلر هرگز نمیتونه عمل Refactoring رو در مورد چنین دسترسیهایی بررسی کنه. در نتیجه برنامه نویس مجبور هست به یاد نگه داره که هنگام تغییر نام متغییر، باید Find All کنه و کلیه نوشته های مشابه رو بررسی کنه که آیا باید دستی تغییر نام پیدا کنن یا خیر.
سلام، خوشحالم که پاسخی مناسب از شما رو میبینم. از توضیحات خوبتون ممنونم. این مسائلی که شما فرمودید تا حدودی درست است، اما تا جایی که یادم مونده، معنای type safety بگونه دیگری بیان شده است. در MSDN، سی شارپ یک زبان Type-Safety و Modernity و Object-orientation و ...، بیان شده است که در حیطه unsafe میتوان کدهایی بصورت non type-safety نوشت.
http://msdn.microsoft.com/msdnmag/issues/0900/csharp/

PC2st
یک شنبه 18 شهریور 1386, 18:21 عصر
من کد مربوطه در لینک که شما معرفی کردی مطالعه کردم

اگر بیشتر به آن دقت کنی میبینی که ساخت کنترلها در زمان ران تایم و به صورت Dynamically
بوده نه دسترسی به آنها .
خوشحالم که اون لینک رو خوندید... همانطور که میدانید، اگر در Run-Time بشه به اشیاء مختلفی (به حالت متغیر گونه) دسترسی داشت، به این دسترسی حالت دینامیک گفته میشه و به همین خاطر من هم گفتم که اینکار، دسترسی دینامیک گفته میشه. مثلا حتما تا بحال عبارت Dynamically Loading Asembley رو شنیدید. چون در زمان Run-Time میشه یک اسمبلی رو لود کرد یا اینکه اصلا لود نکرد یا اینکه اسمبلی دیگری را به جای آن لود کرد. این حالت رو شبیه به دسترسی به کنترلهای یک فرم در نظر بگیرید.




با این کد خیلی متفاوت
متفاوت نیست، با حلقه foreach که آشنایی دارید، اینطور در نظر بگیرید که بجای نام کنترل از اندیس آن استفاده شده، مثلا:
this.Controls[0].Text
که به ترتیب به کنترلهای ان دسترسی پیدا میکنه.




در ضمن معذرت می خوام عصبانی شدم وقتی دیدم بر اشتباهی پا فشاری مشود.... .
خواهش میکنم... بجای عصبانی شدن، بهتر نیست که دلایل گفته بشه تا به یک نتیجه مشخص از این بحث برسیم؟
نتیجه این بحث، نه تنها برای من و شما، بلکه برای بقیه هم مفید خواهد بود.

mehdi.mousavi
دوشنبه 19 شهریور 1386, 09:45 صبح
سلام، خوشحالم که پاسخی مناسب از شما رو میبینم. از توضیحات خوبتون ممنونم. این مسائلی که شما فرمودید تا حدودی درست است، اما تا جایی که یادم مونده، معنای type safety بگونه دیگری بیان شده است. در MSDN، سی شارپ یک زبان Type-Safety و Modernity و Object-orientation و ...، بیان شده است که در حیطه unsafe میتوان کدهایی بصورت non type-safety نوشت.
http://msdn.microsoft.com/msdnmag/issues/0900/csharp/

سلام.
Type-Safe بودن ممکنه به معانی زیادی استفاده بشه:

1. عدم استفاده از متغیرهای Initialize نشده! (بعنوان مثال در C# بر خلاف C، شما نمیتونید از متغیری که Initialize نشده استفاده کنید.)

2. عدم دسترسی به خانه های تعریف نشده یک آرایه! (بعنوان مثال در C# بر خلاف C، شما نمیتونید یه آرایه 3 خونه ای تعریف کنید و به خونه چارم دسترسی پیدا کنید. اما در C، این مساله باعث میشه تا Chunk بعدی حافظه رو Fetch کنید).

3. عدم استفاده از Object برای دسترسی به تایپهای موجود. (بعنوان مثال فرض کنید که Collection ای از Int32 ها میخواهیم داشته باشیم. یه روش، نگهداری عناصر در Collection ای از نوع Object و سپس Downcast کردن خونه مورد نظر به تایپ اصلی (Int32) هنگام بازیابی هستش. چنین کدی Type-Safe نیست).

و بسیاری موارد دیگه.

ضمنا، من همیشه پاسخهام مناسبه! :)

PC2st
دوشنبه 19 شهریور 1386, 11:41 صبح
جناب mehdi6755، جدا که بحث خیلی جذابی شد... خوشحالم که دلایل زیبایی رو ارائه کردید،
وقتی که دلایل بخوبی ذکر بشه، بحث هم زودتر به نتیجه میرسه.
با Reflector کدهای ControlCollection رو مرور کردم. از یک _innerList که از نوع ArrayList است، استفاده کرده که از این مورد بی اطلاع بودم.
و اگر boxing و unboxing بصورت non type safe باشه، پس استفاده از ControlCollection میتونه type safety نباشه.

PC2st
دوشنبه 19 شهریور 1386, 12:39 عصر
3. عدم استفاده از Object برای دسترسی به تایپهای موجود. (بعنوان مثال فرض کنید که Collection ای از Int32 ها میخواهیم داشته باشیم. یه روش، نگهداری عناصر در Collection ای از نوع Object و سپس Downcast کردن خونه مورد نظر به تایپ اصلی (Int32) هنگام بازیابی هستش. چنین کدی Type-Safe نیست).
در نتیجه، استفاده از خاصیت Items برای کنترل ComboBox نیز type safety نیست و در نتیجه به وفور از کدهای فاقد type safe بودن، استفاده میکنیم!

sm_ezadpanah
دوشنبه 19 شهریور 1386, 13:20 عصر
با سلام دوست عزیز من وقت نکردم تاپیک های دوستان رو مطالعه کنم اما برای حل مشکلتون کافیه خاصیت moifier کنترل مورد نظر را public کنید اینجوری تو هر فرم دیگه باتعریف یک متغیر از اون فرم میتونید به کنترل مورد نظر دسترسی پیدا کنید

form1 f1 = new form1();
f1.namecontrol;

mehdi.mousavi
دوشنبه 19 شهریور 1386, 15:21 عصر
جناب mehdi6755، جدا که بحث خیلی جذابی شد... خوشحالم که دلایل زیبایی رو ارائه کردید،
وقتی که دلایل بخوبی ذکر بشه، بحث هم زودتر به نتیجه میرسه.
با Reflector کدهای ControlCollection رو مرور کردم. از یک _innerList که از نوع ArrayList است، استفاده کرده که از این مورد بی اطلاع بودم.
و اگر boxing و unboxing بصورت non type safe باشه، پس استفاده از ControlCollection میتونه type safety نباشه.

دقیقا همینطوری هستش که می فرمایید. به همین دلیل هست که استفاده از ArrayList توصیه نمیشه و عموما توصیه شده تا از List<T> و دیگر تایپهای Generic استفاده بشه. در مورد ComboBox هم فرمایشتون صحیحه. چون دسترسی به آیتمهای ComboBox و سپس cast کردن اونها به تایپ دلخواه، باعث تیریگ شدن عمل Boxing/Unboxing میشه.

PC2st
دوشنبه 19 شهریور 1386, 15:52 عصر
بنابراین، آیا میشه انتظار داشت که در نسخه های بعدی دات نت، ComboBox بتونه انواع Generic رو هم ساپورت کنه!؟
یا اینکه وجود Generics برای ComboBox غیر لازم الوجود خواهد بود!

و در اینصورت اگر خاصیت Controls از Form بر اساس انواع Generic (یا نوع Control بدون boxing/unboxing) کار می کرد، پس ایرادی نداشت که از این خاصیت برای دسترسی به کنترلهای فرم، استفاده کنیم؟!

PC2st
دوشنبه 19 شهریور 1386, 18:10 عصر
دوستان، در واقع منظورم رو بهتر بیان کنم: منظورم این نیست که در حالت عادی، بجای استفاده بصورت
button1.Text
بیایم و بصورت
Controls["button1"].Text
استفاده کنیم، منظورم این بود که در مواقع لزوم و بسته به شرایط، اگر احتیاج بود از ایندکسر خاصیت Controls استفاده کنیم.

مثلا، یک فرم که 10 تا textBox داره و خاصیت های Text و Enabled و Visible و چندین خاصیت دیگر این textBox ها رو احتیاج داریم.
حالا اگر بخوایم از طریق بقیه فرمها، این 10 عدد textBox رو مدیریت کنیم، آیا نوشتن چندین و چند Property (یا متد) که فقط برای دسترسی به این TextBox ها نوشته شده، کار خوشایندی است؟ با توجه به اینکه دسترسی به این 10 textBox روی امنیت داده ها هم تاثیر گذار نباشه.
ممکنه بگویید، "خب یک کلاس رو ایجاد میکنیم که در ایندکسر آن، بتوان توسط عدد به هر 10 textBox دسترسی داشت"، در اینصورت، آیا این کلاس شبیه به خاصیت Controls عمل نمیکنه؟ (البته بدون در نظر گرفتن این نکته که در خاصیت Controls عملیات boxing/unboxing صورت میگیره)(این قسمت که رنگش فرق میکنه، اشتباه است)
خب در این شرایط، بهتر نیست که بجای چند صد خط کد (صرف نوشتن member جهت دسترسی به 10 textBox)، از خاصیت Controls برای دستیابی به textBox ها استفاده کنیم؟ اینطور در نظر بگیرید که این textBox ها تنها به یک فرم متعلق نیستند و توسط فرمهای کل پروژه، باید به آنها دسترسی داشت!

PC2st
دوشنبه 19 شهریور 1386, 21:55 عصر
همین برنامه ای که در پست قبلی توضیحاتش رو دادم، بصورت یک نمونه برنامه نوشتم. در این برنامه، یک برد (تخته اطلاع رسانی، Board) هست که از طریق یک فرم دیگر، این برد آپدیت میشه (با تغییر در شکل ظاهری کنترلها و متون).

قبول دارم که استفاده از ایندکسر خاصیت Controls برای دسترسی به کنترلها، به طور معمول روش مناسبی نیست، ولی بهرحال استفاده از آن، ممکنه بعضی از مواقع بدرد بخور باشه.

البته توی این برنامه، کنترلهای داخل برد، ثابت است و میشد نمونه شیئ کنترلها رو بوسیله property ها در دسترس قرار داد، اما اگر برد به گونه ای نوشته میشد که تعداد کنترلهای آن متغیر بود و هر فرم یا قسمتی از برنامه، یک کنترل خاص رو به برد (تخته) اضافه یا حذف یا تغییر میداد، در اینصورت از property هم نمیشد استفاده کرد.

samprp
سه شنبه 20 شهریور 1386, 11:22 صبح
با سلام دوست عزیز من وقت نکردم تاپیک های دوستان رو مطالعه کنم اما برای حل مشکلتون کافیه خاصیت moifier کنترل مورد نظر را public کنید اینجوری تو هر فرم دیگه باتعریف یک متغیر از اون فرم میتونید به کنترل مورد نظر دسترسی پیدا کنید

متشکرم . ولی مشکل من اینه که من می خوام از داخل فرم 2 مقدار text یک باتن رو عوض کنم و با توجه به اجرا بودم فرم 1 نمی توان یک نمونه ی جدید از اون ایجاد کرد .
خوب با این تعاریف حالا باید چه کار کنم ؟

samprp
سه شنبه 20 شهریور 1386, 11:32 صبح
آقایون
مثل اینه که بحث خیلی داغ شده و مشکل من یادتون رفته .
من با دستوری که یکی از آقایون با استفاده از فایل property.rar برام ضمیمه کرده بودند مشکل رو حل کردم و باید یک متغیر بین دو فرم مشکترک نمود و از اون استفاده کرد (با استفاده از پروپرتیها)
ولی من می خوام بتونم به تک تک خصوصیات کنترل های دیگر از درون فرم دیگر به غیر از فرم اصلی دسترسی داشته باشم . مثلا بتونم کد زیر رو از طریق فرم 2 اجرا کنم
sqlDataAdapter1.SelectCommand.text=strSelectComman d
متغیر strSelectCommand داخل فرم 2 تعریف شده و sqlDataAdapter1 داخل فرم اصلی (فرم2)
می باشد ...
خوب چه طوری این کار رو انجام بدم .

PC2st
سه شنبه 20 شهریور 1386, 12:13 عصر
ولی من می خوام بتونم به تک تک خصوصیات کنترل های دیگر از درون فرم دیگر به غیر از فرم اصلی دسترسی داشته باشم

اگر میخواید که فقط به خاصیت Text دسترسی داشته باشید، از همان روشی که کاربر gomnam گفته، استفاده کنید.


اما اگر میخواید که به تک تک خاصیت های (همه خاصیت های) button1 دسترسی داشته باشید، دو حالت داره:

1- یک خاصیت ایجاد کنید و دسترسی به شیئ button1 رو از این طریق برای دیگر فرم ها میسر سازید.

2- از ایندکسر خاصیت Controls استفاده کنید، که چون در نسخه فعلی دات نت، در نحوه پیاده سازی این خاصیت، عملیات boxing/unboxing صورت میگیره، پس سرعت عملیات به نسبت حالت اول کمتر خواهد بود و با توجه به فرمایشات جناب mehdi6755 (و منابع اینترنتی) این عمل type-safe نیست (بخاطر boxing/unboxing).
امید است که در نسخه بعدی دات نت، نحوه پیاده سازی خاصیت Controls رو عوض کنند (type safe کنند) تا عملیات boxing/unboxing صورت نگیره. (این قسمت که رنگش فرق میکنه، اشتباه است)


پی نوشت:(اشتباه است)
=======
جالب اینجاست که ایندکسر خاصیت Tables از کلاس DataSet هم Type Safe نیست! (non type-safe)
تقریبا انبوهی از collection های دات نت، type safe نیست، دلیل این کار رو باید از مایکروسافت پرسید!
شاید در نسخه بعدی دات نت، پیاده سازی کلاسها رو (که از چشم برنامه نویس پنهان است) عوض کنند!




متغیر strSelectCommand داخل فرم 2 تعریف شده و sqlDataAdapter1 داخل فرم اصلی (فرم2)
برای این حالت، ایجاد یک خاصیت برای این شیئ، مناسب خواهد بود.

abolfazl585
سه شنبه 20 شهریور 1386, 13:19 عصر
ببینید عزیزان، زمانی که ما میخواهیم یک قطعه کد یا برنامه را بنویسیم باید این موضوع را در نظر بگیریم که آیا پس از گذشت مدتی (مثلا 7،8 ماه)، آیا من می توانم کد های نوشته شده ام را Debug کنم؟
باید بگونه ای استاندارد این کار انجام شود که نتنها خودم بلکه کسان دیگر نیز بتوانند کد های بنده را درک کنند.
رعایت این موضوع، قدرت یک برنامه نویس را مشخص می کند.
در مورد موضوعی هم که شما در مورد آن بحث میکنید خدمت دوستان عزیر یادآور می شوم که چه تضمینی وجود دارد که من بخاطر داشته باشم که از یک کنترل در کجا و چگونه استفاده کرده ام تا با تغییر نام آن( که جزئی ترین اشکال این روش میباشد) تمام کدهای استفاده شده در فرم را بازبینی کنم و یا به قول دوست عزیر replace کنم.

به نظر من این روش نتنها نمی تواند راه حل مناسبی باشد بلکه برنامه نویس را دچار سردرگمی و کاهش سرعت وی در کدنویسی خواهد کرد

در ضمن استدلالی هم که جناب PC2st.ir به مطلب خارجی کرده است یک اشکال دارد و آن این است که حلقه های اشاره شده، کنترل های موجود در فرم را بصورت اتوماتیک پیدا می کند و ربطی به این ندارد که مثلا نام کنترل چیست

PC2st
سه شنبه 20 شهریور 1386, 14:46 عصر
ببینید عزیزان، زمانی که ما میخواهیم یک قطعه کد یا برنامه را بنویسیم باید این موضوع را در نظر بگیریم که آیا پس از گذشت مدتی (مثلا 7،8 ماه)، آیا من می توانم کد های نوشته شده ام را Debug کنم؟
باید بگونه ای استاندارد این کار انجام شود که نتنها خودم بلکه کسان دیگر نیز بتوانند کد های بنده را درک کنند.
رعایت این موضوع، قدرت یک برنامه نویس را مشخص می کند.
میدونم، اصولا دسترسی به کنترلهای یک فرم از طریق یک فرم دیگر، در حالت عادی کار مناسبی نیست. اما اگر بنا به دلایلی به این مورد احتیاج داشته باشیم، میشه بپرسم که اگر بخواید به تمام خاصیتهای یک کنترل از فرم، از طریق فرم دیگری دسترسی داشته باشید، چطور طراحی میکنید؟

یاد آوری:
یک ایندکسر (مثل ایندکسر خاصیت Controls) و یک property بسیار شبیه به هم اند!
با اینحال استفاده از property راحت تر از استفاده از ایندکسر برای دستیابی به شیئ است.




در مورد موضوعی هم که شما در مورد آن بحث میکنید خدمت دوستان عزیر یادآور می شوم که چه تضمینی وجود دارد که من بخاطر داشته باشم که از یک کنترل در کجا و چگونه استفاده کرده ام تا با تغییر نام آن( که جزئی ترین اشکال این روش میباشد) تمام کدهای استفاده شده در فرم را بازبینی کنم و یا به قول دوست عزیر replace کنم.

به نظر من این روش نتنها نمی تواند راه حل مناسبی باشد بلکه برنامه نویس را دچار سردرگمی و کاهش سرعت وی در کدنویسی خواهد کرد
من یک سوال دارم، فرض کنید یک فرم داریم که داخل آن فرم، یک Label هست، حال میخواهیم متن این Label رو در داخل همان فرم، تغییر دهیم. یعنی اینکه متن Label رو توی خود فرم تغییر بدیم نه از طریق یک فرم دیگه. حال سوال اینه که چه تضمینی وجود داره که من به خاطر داشته باشم که در کجا (Form Loading یا رویداد کلیک یک دکمه یا ...) متن این Lable رو تغییر دادم!؟ یک راه خوب برای بیاد آوری، استفاده از Commenting در بین خطوط کدهاست. یا نوشتن توضیحاتی برای نحوه عملکرد کلی کدها...





یک اشکال دارد و آن این است که حلقه های اشاره شده، کنترل های موجود در فرم را بصورت اتوماتیک پیدا می کند و ربطی به این ندارد که مثلا نام کنترل چیست
پیشنهاد میکنم یکبار دیگر همان قسمت از کد رو نگاه کنید، اینطور نوشته:


foreach (Control child in parent.Controls)
{
if(child.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox")
&& child.ID.IndexOf("txt_") == 0)
{
...
}
}

دقت کنید که توسط متد Equals مطمئن شده که نوع کنترل TextBox است.
سپس توسط متد IndexOf مطمئن گشته است که نام ID آن کنترل با _text شروع شده.
پس همانطور که دیدید، به این طریق، کنترل رو از طریق نام پیدا میکنه!
همانطور که میدونید، در کنترلهای روی وب خاصیت ID مشخص کننده نام کنترل هست.

gomnam
سه شنبه 20 شهریور 1386, 15:19 عصر
م میشه بپرسم که اگر بخواید به تمام خاصیتهای یک کنترل از فرم، از طریق فرم دیگری دسترسی داشته باشید، چطور طراحی میکنید؟


از طریق property !!!!!!!

PC2st
سه شنبه 20 شهریور 1386, 16:58 عصر
دوستان عزیز gomnam و rasoul_ras و سایر دوستانی که مخالف صحبت های من بودند :-)
دوستان عزیز، متاسفانه همینطوری دارم مقداری مطالب اشتباه مینویسم و دوستی هم پیدا نشد که گوشزد کنه... از همه دوستانی که این تاپیک رو مشاهده میکردند، شدیدا عذر میخوام، در دو تا از پستهام (پست شماره 24 و پست شماره 20) مقداری مطلب اشتباه بود. (خوشحالم که بصورت ناگهانی، به اشتباه خودم پی بردم)
(پستهای قبلی ام رو بصورتی که اشتباهاتم مشخص باشه، ویرایش کردم، رنگ قسمتهای اشتباه بصورت طوسی کمرنگ است)

ایندکسر خاصیت Controls کاملا Type Safe هست.!...!! (قبلا گفته بودم که نیست!)
ایندکسر خاصیت Tables از کلاس DataSet هم کاملا Type Safe هست.!...!! (قبلا گفته بودم که نیست!)
و همچنین است برای Collection های متشابه!

خاصیت Items از کلاس ComboBox بسته به نوع داده هایی که در آن قرار میدیم، ممکنه Type Safe و ممکنه در جایی non Type Safe باشه.
چون همانطور که یک نوع مقداری (Value Type) را در Item های ComboBox بگذاریم، چون عمل boxing/unboxing صورت میگیره پس این عمل Type Safe نیست.
اما در خاصیت Controls از کلاس Form، وقتی که داده ها در یک _innerList از نوع ArrayList ذخیره میشوند، چون نوع کنترلها همیشه از نوع Control است و نوع Control یک Reference Type هست، پس وقتی که کنترلها بصورت object در لیست داخلی، ذخیره میشوند، در واقع عملیات boxing/unboxing صورت نمیگیره چون کنترلها از نوع reference type هستند و بصورت object در _innerList ذخیره میشوند که object هم یک reference type است! پس در واقع خاصیت Controls و درواقع ControlCollection کاملا Type Safe تلقی میشه!

این مورد که عملیات boxing/unboxing یک روش non type safe است، خیلی مورد جالبی بود، بهمین خاطر از mehdi6755 ممنونم.


نتیجه:
پس نتیجه اینکه استفاده از ایندکسر خاصیت Controls هیچ boxing/unboxing ای نداره و بصورت کاملا Type Safe عمل میکنه :-) و خاصیت Tables از DataSet هم Type Safe است و ...

تنها ایندکسر خاصیت Items از ComboBox بسته به شرایط میتونه داده هایی type safe یا non type-safe داشته باشه.

PC2st
سه شنبه 20 شهریور 1386, 17:01 عصر
از طریق property !!!!!!!
از پاسخ شما ممنونم، درسته، انتخاب کاملا صحیح بود، چون خاصیت ساده تر از ایندکسر عمل میکنه (نیازی به پارامتر نیست).
حالا اگر نام کنترل متغیر بود، از چه روشی استفاده میکنید؟
یا اینکه در حین اجرا باید به کنترلهای متفاوتی دسترسی داشته باشید، چیکار میکنید؟

یک راه ایجاد یک شیئ از نوع Control است که همواره ارجاع یک کنترل رو در آن قرار میدیم، و به این شکل به کنترلهای متفاوتی دسترسی پیدا میکنیم.

ولی اگر تنها به نام کنترل دسترسی داشته باشیم؟
یا اینکه بخوایم در یک حلقه به کنترلهایی دسترسی پیدا کنیم که نام آنها از یک قاعده بخصوصی پیروی کنه، مثلا برای دسترسی به هر SP از بانک اطلاعاتی، باید به یک کنترلی همنام با همین SP دسترسی داشته باشیم!؟ یا ...

استفاده از ایندکسر Controls تا حدی میتونه در Encapsulation هم تاثیر گذار باشه، چون نام کنترل رو بعنوان پارامتر به خاصیت Controls میدیم و کد، گویای این خواهد بود که میخواهیم به یک کنترل دسترسی داشته باشیم، مثلا، کدامیک خواناتر است؟


frm2.SpecialButton.Text
//یا این یکی؟
frm2.Controls["SpecialButton"].Text

در کدهای فوق، خط دوم به طور صریح معلوم میکند که به یک کنترل از frm2 میخوایم دسترسی داشته باشیم. استفاده از ایندکسر Controls خواناتر هست ولی نسبت به خط اول کند تر است (تا حد خیلی ناچیز!)، ولی وقتی بخوایم به کنترلهای خود فرم (فرمی که داریم ازش استفاده میکنیم) که به شیئ specialButton1 یعنی شیئ اصلی از کنترل، دسترسی داره، دیگر استفاده از خاصیت Controls در داخل خود فرم، بی معنی خواهد بود. یعنی اگر بصورت زیر بنویسیم، تاحدودی بی معنی خواهد بود (زیرا textBox1 در خود فرم هست و نیازی نیست که از خاصیت Controls استفاده بشه)، مگر اینکه دلیل بخصوصی برای نوشتنش داشته باشیم:
this.Controls["textBox1"].Text
اما اگر بجای this یک فرم به غیر از فرم جاری بود، مثلا فرم frm2 بود، کد فوق، تاحدی در خوانا بودن کدها تاثیر گذار بود.

abolfazl585
چهارشنبه 21 شهریور 1386, 09:35 صبح
property روشی هست که msdn نیز آن را پیشنهاد داده است.
حتی در Vs2005 به بعد و خصوصا در Vs2008 برنامه نویس را مجبور به استفاده از property نموده است

(از مسئولین سایت برنامه نویس هم تشکر می کنم که بالاخره از آژاکس استفاده کردن.)
(تفاوت را احساس کنید یعنی این)

PC2st
چهارشنبه 21 شهریور 1386, 16:03 عصر
در MSDN (و در کل در همه جا)، استفاده از Property بجای دسترسی مستقیم به object instance، تاکید شده است.
به همین خاطر همیشه برای دسترسی به فیلد یک کلاس، از property استفاده میکنیم.
همانطور که میدونید، یک indexer و یک property بسیار بسیار شبیه به هم اند.

استفاده از ایندکسر خاصیت Controls (و در کل indexer ها)، هیچوقت نقض کننده اصول OOP ، کپسوله بودن یا ... نبوده است.

samprp
یک شنبه 25 شهریور 1386, 07:22 صبح
property روشی هست که msdn نیز آن را پیشنهاد داده است.
حتی در Vs2005 به بعد و خصوصا در Vs2008 برنامه نویس را مجبور به استفاده از property نموده است

(از مسئولین سایت برنامه نویس هم تشکر می کنم که بالاخره از آژاکس استفاده کردن.)
(تفاوت را احساس کنید یعنی این)
آژاکس ؟
آژاکس چیه دیگه . ربطی به C# داره یا یک کمپوننت جدیده . لطفا بیشتر توضیح بدین.

gomnam
یک شنبه 25 شهریور 1386, 07:48 صبح
احتمالا آژاکس آمستردادم هستش !!!!
نه عزیز ببین آژاکس که واژه انگلیسی اون AJAX میباشد در واقع یه تکنولو/زی هست که توی صفحات وب از اون استفاده میشه و خلاصه بگم اینکه وقتی شما در خواستی را از سرور خودتون میکنین از refresh شدن کلی صفحه جلوگیری کرده و فقط اون قسمتی که نیاز هست refresh میشه که باعث آفزایش سرعت در صفحات وب میشه منثل این که تقریبا داری با یه برنامه win app محاوره میکنی
تکنولوژی اون هم بر اساس java script و xml می باشد
AJax=Asynchronous JavaScript and XML

توی این سایت هم اگه دقت کرده باشی موقعی که از طریق بخش پاسخ سریع پست میفرستی وقتی دکمه فرستادن پاسخ را میزنی صفحه refresh نمیشه

در مورد این مطلب توی سایت مطالب زیادی هست ولی نه در بخش سی شارپ !!!
ایجا هم یه دنیا مطلب هست (http://www.google.com/search?client=opera&rls=en&q=AJax+%DA%86%DB%8C%D8%B3%D8%AA&sourceid=opera&ie=utf-8&oe=utf-8)
موفق باشید
کیانی

اَرژنگ
یک شنبه 25 شهریور 1386, 08:15 صبح
property روشی هست که msdn نیز آن را پیشنهاد داده است.
حتی در Vs2005 به بعد و خصوصا در Vs2008 برنامه نویس را مجبور به استفاده از property نموده است


چرا پیشنهاد دادند؟ دلیلشان برایه این یکی روش را پیدا کردن بیشتر آموزش میده.

samprp
یک شنبه 01 مهر 1386, 21:43 عصر
مطالب زیر روی از روی یه ای بوک ترجمه کردم .

نواع ارجاعی
نمونه هایی از کلاس , نوع های ارجاعی می باشند . نوع های ارجاعی روی هپ تخصیص داده می شوند . در سی شارپ , همه ی کلاس ها از شی کلاس دات نت فریم ورک درون فضای نام سیستم مشتق می شوند . سی شارپ اشاره گر ها را پشتیبانی نمی کند , اما کلاس ها , انوان داده ی ارجاعی می باشند , همانند اشاره گرها . اگر تو یک اشاره گر را به اشاره گر دیگر کپی کنی , هر دوی آنها از همان شیئ ارجاع می شوند . تو می توانی محتویات شی اصلی را از درون هر یک از اشاره گر ها تغییر دهی . در سی شارپ , اگر تو یک شی کلاس را معرفی کنی و سپس از آن یک کپی بگیری , تغییرات داده شده به هر یک از نمونه های کلاس باعث تغییر شیئ اصلی می شود .
کلمه ی کلیدی نیو برای تخصیص یک نمونه از یک نوع ارجاعی (کلاس) استفاده می شود . در سی شارپ شما نیازی به آزاد سازی یک نمونه ی یک کلاس ندارید . سی ال ار روی نمونه های شی عمل زباله روبی را انجام می دهد تا بیش از این ارجاع نشوند .

بعضی اوقات متد های کلاس به نمونه های مشتق شده از شی کلاس فریم ورک نیاز دارند
سی شارپ دارای یک خصیصه است که به آن باکسینگ گفته می شوند , که به طور خودکار یک نوع مقدار را به یک نوع ارجاع هنگام نیاز به یک نوع ارجاع تبدیل می کند . به مجرد بازگشت از متد , روال معکوس که آنباکسینگ نامیده می شود , به نوع مقدار تبدیل خواهد کرد . به عنوان یک برنامه نویس , تو به انجام هیچ چیز بخصوصی برای استفاده از باکسینگ نیاز نداری . تو باید به خاطر داشته باشی که , به هر حال , بعضی از بالاسری ها در جریان روال باکسینگ / آنباکسینگ مداخله می کنند .
نظرتون در مورد مطالب بالا چیه .
مطالب رو خودم ترجمه کردم ولی من وقتی از اونا استفاده می کنم مثلا هر تغییری که روی فرم اصلی انجام بشه روی فرم ارجاعی انجام نمی شه .
و مشکل بعدی من اینه که می خوام در آغازی که برنامه اجرا می شه یک نمونه هم از فرم اصلی اجرا بشه و گرنه باید در روال فرم لودینگ دستور نیو رو قرار داد که باعث اجرا شدن دو فرم می شه . در ضمن من خودنم (داخل همون ای بوک) که اگر بخوای از تمام متد های یک کلاس استفاده کنی باید حتما یک نمونه از آن کلاس ایجاد کنی . می خواستم بدونم که آیا این درسته و اگر درسته می شه بدون این کار (ایجاد نمونه ی جدید از یک کلاس) این کار رو انجام داد .

PC2st
یک شنبه 01 مهر 1386, 23:05 عصر
نظرتون در مورد مطالب بالا چیه .
سوالتون در رابطه با "استفاده از فرم و ارجاع به آن" مطرح شده در حالیکه این تاپیک در رابطه با "استفاده از کنترلهای فرم در فرم دیگر" است.
لطفا این موضوع رو در یک تاپیک جدید مطرح کنید... ممنون :-)

بهنام جعفرزاده
یک شنبه 06 آبان 1386, 14:32 عصر
سلام دوستان میتونید کمکم کنید کار با چند فرم در یک برنامه را در سی شارپ یاد بگیرم
مثلا روی فرم یک روی یک باتن کلیک کنم و به فرم شماره 2 بروم و به اطلاعات هر دو فرم هم بتوانم دسترسی داشته باشم

omid_Ahmadi
یک شنبه 06 آبان 1386, 22:12 عصر
دوست عزیز در این رابطه قبلاً بحث شده، با یه سرچ می تونی راحت مطالب مورد نظرت رو پیدا کنی.
موفق باشی

mohammadkiani
یک شنبه 24 اسفند 1393, 19:37 عصر
دوست عزیز omid_ahmadi اگر ممکن لینک بدید. چون بنده ابتدا خیلی سرچ کردم. اما موفق نشدم