PDA

View Full Version : سوال: ارث بری از TextBox ساخته شده در FormLoad



yassou
دوشنبه 12 فروردین 1392, 19:49 عصر
با سلام به همه دوستان
من تو FormLoad برنامم دستور زیر رو که قسمتی از دستور هام هستش رو بکار بردم :

case (6):
this.Opacity = 0;
DialogResult DR = MessageBox.Show("You Are NOT Authorized. To See The Info You Shoud Be Login. Are You Authorized? ", "Authorized Verification", MessageBoxButtons.YesNoCancel);
switch (DR)
{
case DialogResult.Yes:
Form F1 = new Form();
T1 = new TextBox();
T2 = new TextBox();
B = new Button();
F1.Controls.Add(T1);
F1.Controls.Add(T2);
F1.Controls.Add(B);
T1.Text = "Username";
T2.Text = "Password";
B.Text = "Enter";
F1.BackgroundImage = imageList1.Images[11];
T1.Location = new Point(30, 40);
T2.Location = new Point(150, 40);
B.Location = new Point(105, 90);
T1.Enter += new EventHandler(T1_Enter);
T2.Enter += new EventHandler(T2_Enter);
F1.Show();
B.Click += new EventHandler(B_Click);
break;
و عبارت های T1,T2,B رو به صورت Global در نظر گرفتم مثل دستور زیر :

public partial class The_Prototype_Information : Form
{
TextBox T1;
TextBox T2;
Button B;
EventHandler ها هم برای T1,T2 عبارتند از :

void T1_Enter(object sender, EventArgs e)
{
T1.Text = "";
T1.PasswordChar = '*';
}
void T2_Enter(object sender, EventArgs e)
{
T2.Text = "";
T2.PasswordChar = '*';
}
حالا می خواستم ببینم میتون با زدن Button و نوشتم دستور مربوطه از دو TextBox های T1,T2 ارث بگیرم و این Handler های بالایی رو ننویسم ؟ مثل کدهای زیر :

private void button1_Click(object sender, EventArgs e)
{
//textBox1: T1;
//textBox2: T2;
//textBox1.Enter += new EventHandler(T1_Enter);
//textBox2.Enter += T2_Enter;
با تشکر .

yassou
چهارشنبه 14 فروردین 1392, 16:25 عصر
با سلام دوباره به همه
می خواستم ببینم اینقدر سوالم سخته که بعد از اینکه 94 نفر از این تاپیک رو مشاهده کردن و خوده تاپیکم به صفحه 5 رفته بودش هنوز یه پاسخ هم براش نیست یا شایدم من بد توضیح دادم و شایدم هزارتا شاید دیگه ...... .

RED-C0DE
چهارشنبه 14 فروردین 1392, 22:57 عصر
برادر عزیز اونقد بد نوشتی و توضیح دادی و کثیف کد نوشتی آدم حالش بد می شه تا آخر بخونه اونوقت جالبه طلبکارم هستی! :)))

اگه تمایل داشتی کسی جواب بده اولا انتظاری نداشته باش، دوما احتمال این رو بده کسی لحن و صحبت و توضیحت رو متوجه نشده باشه یا فوقش دیگه اونایی ک این تاپیک رو می بینن و ج نمی دن جوابشو نمی دونن یا حال نمی کنن ج بدن ب هر دلیلی ;)

---
می خوای چنتا textBox داشته باشی و همشون یکسری مشخصات داشته باشن یا چیز دیگه ای؟

yassou
چهارشنبه 14 فروردین 1392, 23:56 عصر
برادر عزیز اونقد بد نوشتی و توضیح دادی و کثیف کد نوشتی آدم حالش بد می شه تا آخر بخونه اونوقت جالبه طلبکارم هستی! :)))

اگه تمایل داشتی کسی جواب بده اولا انتظاری نداشته باش، دوما احتمال این رو بده کسی لحن و صحبت و توضیحت رو متوجه نشده باشه یا فوقش دیگه اونایی ک این تاپیک رو می بینن و ج نمی دن جوابشو نمی دونن یا حال نمی کنن ج بدن ب هر دلیلی ;)

---
می خوای چنتا textBox داشته باشی و همشون یکسری مشخصات داشته باشن یا چیز دیگه ای؟
اول-سلام
دوم-اینکه دوست عزیز ممنون از پاسخی که به اون تاپیکم دادین ، به یه روش دیگه حل شد .
سوم-فکر نکم بد و کثیف توضیح داده باشم ، تا اونجاییکه در توانم بود خواستم سوالم واضح باشه (تاپیکی ندیدم که به اندازه من وارد جزیات بشه) ، فکر کنم کلمات خوبی بکار نبردی .
چهارم-فکر نکنم به فرد خاصی اشاره کرده باشم خوبه که از خودم شروع کردم، ولی انگار یه چیزا معلوم شد..... .
پنجم-طبف تجربه ای که تو فرم ها داشتم بعد از اینکه 94 نفر یه تاپیک رو مشاهده می کنن و خوده تاپیکم به صفحه 5 میره، دیگه میشه گفت امیدی به جواب نیست!
ششم-اگه سوالی در مورده سوالم هست بهتره مطرح بشه تا اونجاییکه در توانم هست منم قسمت های مبهم رو باز میکنم. کسی رو هم مجبور به جواب دادن نمی کنم .
هفتم-بی خیال .
خوب الان بریم درمورد مطلب حرف بزنیم :
تو قسمت FormLoad برنامم TextBox درست کردم و بهش EventHandler اضافه کردم ، حالا میخوام از این TextBoxها ارث بگیرم تا از نو دیگه این EventHandlerها رو برای TextBoxهایی که تو قسمت Designبرنامم هستش ننویسم.
به عبارت دیگه آیا یک همچین چیزی ممکنه که TextBoxهایی که تو حالت RunTime ماهیت پیدا میکنن (بوجود میان) قابلیت ارث دهی به TextBoxهایی باشن که تو قسمت DesignTime برنامه هستن ؟
با تشکر .

RED-C0DE
پنج شنبه 15 فروردین 1392, 08:27 صبح
ب بیان ساده
برای ارث بری باید ی کلاس داشته باشی،‌یعنی از ی کلاس می تونی ارث بری کنی نه از ی object ... اون TextBox هایی ک در حالت دیزاین روی فرم می ذاری در واقع Object هایی از کلاس System.Windows.TextBox (ک در نوار ابزار ویژوال استودیو هستن و دراگ می کنی روی فرم) هستن. پس در حالت runtime هم نمی تونی از این TextBox ها ارث بری کنی چون خودشون ی object هستن

اگه می خوای فقط رویدادهای مشترک داشته باشن یعنی در حالت ران تایم ک تعریف می کنی رویداد TextChanged اشون رو متصل کنی ب رویداد TextChanged ی TextBox دیگه، این شدنیه مثل همون کاری ک تقریبا خودت کردی:
TextBox myTextBox1 = new TextBox();
myTextBox1.TextChanged += T2_Enter;
//...


----
ی راه حل دیگه (گرچه صورت مسئله ات و هدفی ک داری رو هنوز درک نکردم ک مشکل از منه مسلما) :
(با فرض اینکه کمی با مفاهیم ارث بری و استفاده از اون در C# آشنا باشی)
ی کلاس جدید تعریف کن (اسمش رو مثلا بزار MyTextBox)
این کلاس رو از System.Windows.TextBox ارث ببر
هر کاری ک قراره کلیه TextBox ها بصورت مشترک انجام بدن (مثل اینکه BackColor همگی یک رنگ یکسان باشه، یا وقتی ک TextBox انتخاب و Focused شد زبان تایپ در اون فارسی بشه ، ...) رو در این TextBox انجام بده
وقتی برنامه رو کامپایل کنی ی کنترل ب اسم MyTextBox توی نوار ابزار اون بالا می یاد و می تونی بزاریش روی فرم

حالا هر TextBox ای ک از این کنترل بزاری روی فرم ، یا در runtime تعریف کنی، تمام خصوصیات و قابلیت های مشترک رو (ک در کلاس MyTextBox تعریف کردی) دارن...

public class MyTextBox : System.Windows.TextBox
{
private void MyTextBox_Enter (object sender , System.EventArgs e)
{
this.BackColor = Color.Red;
}

private void MyTextBox_Leave(object sender , System.EventArgs e)
{
this.BackColor = Color.Green;
}
//...
}