PDA

View Full Version : سوال: تولید یک کنترل با کد با دسترسی public



m0hammad_01
دوشنبه 06 شهریور 1391, 16:26 عصر
سلام

من تو یک تابع با کد تعدادی کنترل می سازم. (در اینجا مثلا یک دکمه)

Button btn = new Button();
btn.Text = "شروع";
btn.Click += new EventHandler(btn_Click);
btn.Width = 75;
btn.Location = new Point(55, 220);
btn.BringToFront();
btn.Name = "btn " + deviceName;
btn.Text = btn.Name;

مشکل من اینجاست که خارج از این تابع به هیچ وجه به این کنترلی که دارم می سازم دسترسی ندارم (در اینجا به btn ای که می سازم دسترسی ندارم)
کسی راه حلی به ذهنش میرسه؟

hamidkh
دوشنبه 06 شهریور 1391, 16:58 عصر
سلام
یه راه اینه که کنترل هایی که میسازین رو توی یک پنل بذارید و به هر کنترلی که میسازین یه تگ بدین. بعد برای دستیابی به کنترل مورد نظر توی کنترل هایی که داخل پنل هست بگزدین و کنترل مورد نظرتون رو پیدا کنید.

m0hammad_01
دوشنبه 06 شهریور 1391, 20:32 عصر
سلام
یه راه اینه که کنترل هایی که میسازین رو توی یک پنل بذارید و به هر کنترلی که میسازین یه تگ بدین. بعد برای دستیابی به کنترل مورد نظر توی کنترل هایی که داخل پنل هست بگزدین و کنترل مورد نظرتون رو پیدا کنید.

ممنون دوست عزیز
اما من با ساخت کنترل (چه بهش اسم متفاوت بدم چه با مقدار تگ دسترسی داشته باشم) مشکلی ندارم.
من منظورم تو زمان کد نویسی هست نه زمان اجرا.
مثلا من توی یک تابع با کد یک کنترل ایجاد کردم. اما خارج از اون تابع به اون کنترلی که درست کردم دسترسی ندارم.می خوام بدونم چطوری میشه این مشکل رو حل کرد. (تو مثال تو یک تابع اومدم کدی نوشتم که btn رو ایجاد کنه و خیلی کارها رو روش انجام میدم اما به همین btn، خارج از این تابع دسترسی ندارم)
تا اونجایی که می دونم نحوه ایجاد کنترل با کد رو دست انجام میدم.



public Control createGrpBox(string dvcName)
{
Button btn = new Button();
btn.Text = "شروع";
btn.Click += new EventHandler(btn_Click);
btn.Width = 75;
btn.Location = new Point(55, 220);
btn.BringToFront();
btn.Name = "btn " + deviceName;
btn.Text = btn.Name;
return btn
}

hamidkh
دوشنبه 06 شهریور 1391, 23:37 عصر
خب میتونید این دکمه ها رو تو یه آرایه از دکمه ها قرار بدین. بعد ازشون استفاده کنید.

the king
سه شنبه 07 شهریور 1391, 00:28 صبح
ممنون دوست عزیز
اما من با ساخت کنترل (چه بهش اسم متفاوت بدم چه با مقدار تگ دسترسی داشته باشم) مشکلی ندارم.
من منظورم تو زمان کد نویسی هست نه زمان اجرا.
مثلا من توی یک تابع با کد یک کنترل ایجاد کردم. اما خارج از اون تابع به اون کنترلی که درست کردم دسترسی ندارم.می خوام بدونم چطوری میشه این مشکل رو حل کرد. (تو مثال تو یک تابع اومدم کدی نوشتم که btn رو ایجاد کنه و خیلی کارها رو روش انجام میدم اما به همین btn، خارج از این تابع دسترسی ندارم)
تا اونجایی که می دونم نحوه ایجاد کنترل با کد رو دست انجام میدم.



public Control createGrpBox(string dvcName)
{
Button btn = new Button();
btn.Text = "شروع";
btn.Click += new EventHandler(btn_Click);
btn.Width = 75;
btn.Location = new Point(55, 220);
btn.BringToFront();
btn.Name = "btn " + deviceName;
btn.Text = btn.Name;
return btn
}




در اسم (Name) کنترل از کاراکتر فاصله استفاده نکنید.

دسترسی به دکمه buttonName در فرمی که داخلش کد نویسی می کنید :

Button btn = (Button)this.Controls.Find("buttonName", true)[0];
btn.Text = "Test";


دسترسی به دکمه buttonName در فرم Form1 که الان در حال نمایش است :

Button btn = (Button)Application.OpenForms["Form1"].Controls.Find("buttonName", true)[0];
btn.Text = "Test";

hakim22
سه شنبه 07 شهریور 1391, 07:44 صبح
خیلی پیچیدش کردید.
یا من درست متوجه نشدم یا جواب راحت باید همین باشه :

دوست عزیز شما به راحتی با کپی کردن این خط کد
Button btn ;
به قسمت بیرون از تابع اونو به صورت عمومی درون کلاس تعریف می کنید. با کلمه ی کلیدی Public هم می توانید از بیرون از کلاس اونو فراخوانی کنید .
مثل هر متغیر دیگه ای میشه از کنترل ها هم به صورت عمومی استفاده کرد.

مباحث مربوط به Scope در برنامه نویسی شی گرا رو مطالعه فرمایید.

m0hammad_01
سه شنبه 07 شهریور 1391, 14:11 عصر
خب میتونید این دکمه ها رو تو یه آرایه از دکمه ها قرار بدین. بعد ازشون استفاده کنید.
ممنون دوست عزیز.این هم یه راه واسه مدیریت کنترل های تولید شده با کد.اما من نمیتونم استفاده کنم.چون مجبور میشم تمام کدهام و تغییر بدم و امتحان نکردم که مشکل من یکی رو حل میکنه یا نه.
سپاسگزار به خاطر راه حلت :چشمک:




در اسم (Name) کنترل از کاراکتر فاصله استفاده نکنید.

دسترسی به دکمه buttonName در فرمی که داخلش کد نویسی می کنید :

Button btn = (Button)this.Controls.Find("buttonName", true)[0];
btn.Text = "Test";


دسترسی به دکمه buttonName در فرم Form1 که الان در حال نمایش است :

Button btn = (Button)Application.OpenForms["Form1"].Controls.Find("buttonName", true)[0];
btn.Text = "Test";

ممنون.از راه حلتون استفاده کردم.جواب داد.
واقعا سپاسگزارم بابت کمکت
:لبخندساده::چشمک:




خیلی پیچیدش کردید.
یا من درست متوجه نشدم یا جواب راحت باید همین باشه :

دوست عزیز شما به راحتی با کپی کردن این خط کد
Button btn ;
به قسمت بیرون از تابع اونو به صورت عمومی درون کلاس تعریف می کنید. با کلمه ی کلیدی Public هم می توانید از بیرون از کلاس اونو فراخوانی کنید .
مثل هر متغیر دیگه ای میشه از کنترل ها هم به صورت عمومی استفاده کرد.

مباحث مربوط به Scope در برنامه نویسی شی گرا رو مطالعه فرمایید.
دوست عزیز شما درست متوجه شدی مساله رو.اما این روشی که میگی برای تولید کنترل امکان نداره.کنترل رو حتما باید new کرد و یک نمونه جدید از کلاس Button رو حتما باید از این طریق تولید کرد.

من از Button btn = new Button() استفاده کردم تو کلاس.توی تمام آبجکت ها هم مشکل نداره و قابل دسترس میشه.اما با کدی که من تو تابع ام نوشتم نمیتونه دکمه رو تولید کنه!!!!!!!!

سپاسگزار بابت توجه و کمکت:چشمک:

hakim22
سه شنبه 07 شهریور 1391, 16:47 عصر
اگه بیشتر از یک میلیون نشده باشده در حد چند صد هزار خط کد با CS نوشتم و تا به حال چنین چیزی ندیدم !

m0hammad_01
سه شنبه 07 شهریور 1391, 18:18 عصر
اگه بیشتر از یک میلیون نشده باشده در حد چند صد هزار خط کد با CS نوشتم و تا به حال چنین چیزی ندیدم !
:لبخند:
Button btn ای که گفتی جواب نداد. این هم پیغام خطایی که میده.و در ادامه پیشنهاد میده از new برای ساخت نمونه آبجکت استفاده کن.

"Object reference not set to an instance of an object"

بجاش من از این کد استفاده کردم.


Button btn = new Button();
جواب میده و تو تمام جاهایی که میخوام قابل دسترس میشه.
اما تو کدی که من دارم کارایی نداره و مشکل من رو حل نمیکنه.شایدم فعلا کاراییش واسم مشخص نشده.

hakim22
چهارشنبه 08 شهریور 1391, 08:16 صبح
دوست عزیز کدی که من ارائه کردم فقط btn رو تعریف میکنه ولی بهش مقداری نمیده .
مقدار رو شما هروقت میخواهی ازش استفاده کنی بهش اختصاص میدی یا با new یک نمونه ی جدید از کلاس رو میسازی .

شا فقط باید تعریف ها رو از درون متد خارج کنید و به درون کلاس ببرید.
اگر میخواهید بدون نمونه سازی از کلاس از متغیرهای درونش استفاده کنید باید Static رو به اول تعریف اضافه کنید.

راه بهتر اینکه محتویات یک کلاس رو از درون کلاس دیگه کنترل کنید ساختن یک سری متد public درون اون کلاسه .
همیشه باید مواظب Cycling باشید. dependency هم خیلی مهم میشه. با استفاده از Code metrics یک آماری از برنامه داشته باشید
که به شما درصد وابستگی و چرخش رو بده و باید این اعداد رو کنترل کنید.