PDA

View Full Version : سوال: کمک در ساخت کنترل سفارشی با امکان تشخیص focus



vahid2112
یک شنبه 01 بهمن 1391, 00:51 صبح
سلام
یه یوزر کنترل دارم که چند تاش رو فرم اضافه میشه
میخام وقتی که روی هر کدومش کلیک میکنم تنها بک گراند اون سفید باشه و بقیه مشکی
و وقتی روی یکی دیگش کلیک کنم رنگ قبلی هم مثل بقیه باز مشکی بشه
یعنی میخام امکان تشخیص focus داشته باشه
چیکار باید بکنم؟

Mahmoud.Afrad
یک شنبه 01 بهمن 1391, 02:07 صبح
میتونید در کلاس یوزر کنترل ، رویدادهای مربوطه را override کنید:
public partial class UserControl1 : UserControl
{
Color gotFocusColor = Color.WhiteSmoke;
Color lostFocusColor = Color.Black;

public UserControl1()
{
InitializeComponent();

this.BackColor = lostFocusColor;
}

protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);

this.BackColor = gotFocusColor;
}

protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);

this.BackColor = lostFocusColor;
}
}

vahid2112
یک شنبه 01 بهمن 1391, 15:36 عصر
سلام
کدها رو استفاده کردم
اما جواب نگرفتم
یعنی وقتی روی یکی دیگش کلیک میکنم رنگ قبلی تغییرنمیکنه
اشکال از کجاست؟

the king
یک شنبه 01 بهمن 1391, 15:58 عصر
سلام
کدها رو استفاده کردم
اما جواب نگرفتم
یعنی وقتی روی یکی دیگش کلیک میکنم رنگ قبلی تغییرنمیکنه
اشکال از کجاست؟

لابد برای اینکه در سوال تون اشاره نکرده بودید که اون User Control تون خالی نیست و داخلش یک یا چند کنترل فرزندی وجود داره که می توانند Focus
بگیرند. وقتی User Control شما فرزند Focus پذیر داره، فرزند های حریص Focus رو می گیرند و دیگه Focus به خود User Control نمیرسه
و رخداد های OnGotFocus و OnLostFocus رخ نخواهند داد.


public partial class UserControl1 : UserControl
{

Color gotFocusColor = Color.WhiteSmoke;
Color lostFocusColor = Color.Black;

public UserControl1()
{
InitializeComponent();

this.BackColor = lostFocusColor;
}

protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);
e.Control.GotFocus += new EventHandler(Control_GotFocus);
e.Control.LostFocus += new EventHandler(Control_LostFocus);
}

void Control_LostFocus(object sender, EventArgs e)
{
this.BackColor = lostFocusColor;
}

void Control_GotFocus(object sender, EventArgs e)
{
this.BackColor = gotFocusColor;
}
}

vahid2112
یک شنبه 01 بهمن 1391, 16:14 عصر
ممنون
شما درست میگی
ولی باز هم یه مشکلی هست
اگر کنترلهایی مثل label,textbox باشند درست و بی نقص کار میکنه
اما اگه یه پنل سطح یوزر کنترل رو پوشونده باشه و بقیه کنترلها توش باشند دیگه جواب نمیده

vahid2112
یک شنبه 01 بهمن 1391, 16:15 عصر
شاید علتش اینه که کنترلها ، کنترلهای فرزند پنل حساب میشن، درست میگم؟

vahid2112
یک شنبه 01 بهمن 1391, 16:18 عصر
حالا راه حل این چیه؟
چطور بایدبهش فهموند؟

vahid2112
یک شنبه 01 بهمن 1391, 16:54 عصر
دوستان کسی بلد نیست ما رو کمک کنه؟
:افسرده::افسرده::افسرده:

the king
یک شنبه 01 بهمن 1391, 17:30 عصر
کم کم دارید طبقه بندی رخداد های ویندوز رو می زنید به هم.


شاید علتش اینه که کنترلها ، کنترلهای فرزند پنل حساب میشن، درست میگم؟
دقیقا، یا باید با Timer مدام چک کنید که الان کدوم کنترل فعاله و یا باید کد رو طوری تغییر بدهید که نه تنها فرزند ها، نوه ها هم به User Control تون رحم کنند :

public partial class UserControl1 : UserControl
{

Color gotFocusColor = Color.WhiteSmoke;
Color lostFocusColor = Color.Black;

public UserControl1()
{
InitializeComponent();

this.BackColor = lostFocusColor;
}

protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);
SayFocus(e.Control);
}

void SayFocus(Control ctl)
{
ctl.ControlAdded += new ControlEventHandler(Control_ControlAdded);
ctl.GotFocus += new EventHandler(Control_GotFocus);
ctl.LostFocus += new EventHandler(Control_LostFocus);
foreach (Control child in ctl.Controls)
{
SayFocus(child);
}
}

void Control_ControlAdded(object sender, ControlEventArgs e)
{
this.OnControlAdded(e);
}

void Control_LostFocus(object sender, EventArgs e)
{
this.BackColor = lostFocusColor;
}

void Control_GotFocus(object sender, EventArgs e)
{
this.BackColor = gotFocusColor;
}
}

khokhan
یک شنبه 01 بهمن 1391, 17:40 عصر
دوستان کسی بلد نیست ما رو کمک کنه؟
:افسرده::افسرده::افسرده:

منظور از اینکه بک گراندش سیاه باشه یعنی بک گراند کنترل یا فرم ؟

ممکنه بیشتر توضیح بدین ؟

vahid2112
یک شنبه 01 بهمن 1391, 17:54 عصر
کم کم دارید طبقه بندی رخداد های ویندوز رو می زنید به هم.

اشکالی داره مگه؟

khokhan
یک شنبه 01 بهمن 1391, 17:57 عصر
منظورتون اینه ؟

vahid2112
یک شنبه 01 بهمن 1391, 17:58 عصر
منظور از اینکه بک گراندش سیاه باشه یعنی بک گراند کنترل یا فرم ؟

ممکنه بیشتر توضیح بدین ؟

بک گراند یوزر کنترل

بااین روش که the king عزیز گفت فقط زمانی جواب میده که کنترلی مثل تکست باکس باشه
اما زمانی که لیبل باشه جواب نمیده

vahid2112
یک شنبه 01 بهمن 1391, 18:05 عصر
منظورتون اینه ؟

بله
اما میخام بجای تکست باکس یوزر کنترل خودم باشه
یوزرکنترل من از چند لیبل تشکیل شده که توی یه پنل قرار داده شدن
از این یوزر کنترل چند تاش روی یه فرم دارم
ومیخام وقتی روی این یوزر کنترل کلیک میشه(هرجاش) بک گراندش مشکی بشه
وقتی روی یکی دیگه از این کنترل روی فرم کلیک میشه، بک گراند کنترل قبلی برگرده به حالت پیشفرض(سفید)

vahid2112
یک شنبه 01 بهمن 1391, 18:12 عصر
اینم یه مثال
98747

ممنون میشم راهنمایی کنی

vahid2112
یک شنبه 01 بهمن 1391, 18:14 عصر
البته اینجا فقط با کلیک روی تکست باکس بک گراند کنترل تغییر میکنه
و من میخام با کلیک روی کل فضای کنترل(لیبل و پنل ) هم بک گراند تغییرکنه

vahid2112
یک شنبه 01 بهمن 1391, 19:05 عصر
دوستان کسی بلد نیست کمک کنه؟

the king
یک شنبه 01 بهمن 1391, 19:08 عصر
البته اینجا فقط با کلیک روی تکست باکس بک گراند کنترل تغییر میکنه
و من میخام با کلیک روی کل فضای کنترل(لیبل و پنل ) هم بک گراند تغییرکنه

هم Panel و هم Label می توانند BackColor ئه Transparent داشته باشند، مشخصه BackColor اون Label ها و Panel ها رو
روی Transparent (گروه رنگ های Web، بالاترین گزینه لیست) تنظیم کنید تا با عوض شدن رنگ User Control مورد دیگه ای
برای تغییر رنگ نمونه.

vahid2112
یک شنبه 01 بهمن 1391, 19:23 عصر
فکر کنم منظورم رو درست نرسوندم
میشه یه نگاهی به پروژه زیر بندازین

98752

vahid2112
یک شنبه 01 بهمن 1391, 19:27 عصر
مشکلم اینجاست که با کلیک روی لیبل و پنل بک گراند یوزرکنترل تغییری نمیکنه

vahid2112
یک شنبه 01 بهمن 1391, 19:47 عصر
mySample.rar (http://barnamenevis.org/attachment.php?attachmentid=98752&d=1358698917)

اگه ممکنه از روی این پروژه راهنماییم کنید

:لبخندساده:

vahid2112
یک شنبه 01 بهمن 1391, 22:02 عصر
پروژه ای رو که گذاشتم با کمک دوستان نوشته شده

مشکلشم اینه که focus یوزر کنترل رو فقط در تکست باکس تشخیص میده
ولی در لیبل و پنل تشخیص نمیده

اگه کسی لطف کنه راهنمایی کنه ممنون میشم

Mahmoud.Afrad
یک شنبه 01 بهمن 1391, 22:35 عصر
در رویداد کلیک ، فوکوس را به یوزرکنترل بدید:

Color gotFocusColor = Color.White;
Color lostFocusColor = Color.Yellow;

public UserControl1()
{
InitializeComponent();

this.BackColor = lostFocusColor;
foreach (Control c in this.Controls)
{
SayFocus(c);
}
}

void SayFocus(Control ctl)
{
ctl.ControlAdded += new ControlEventHandler(ctl_ControlAdded);
ctl.GotFocus += new EventHandler(ctl_GotFocus);
ctl.Click += new EventHandler(ctl_Click);
ctl.LostFocus += new EventHandler(ctl_LostFocus);
foreach (Control child in ctl.Controls)
{
SayFocus(child);
}
}
void ctl_GotFocus(object sender, EventArgs e)
{
this.BackColor = gotFocusColor;
}
void ctl_LostFocus(object sender, EventArgs e)
{
this.BackColor = lostFocusColor;
}
void ctl_ControlAdded(object sender, ControlEventArgs e)
{
SayFocus(e.Control);
}
void ctl_Click(object sender, EventArgs e)
{
this.Focus();
}

vahid2112
یک شنبه 01 بهمن 1391, 23:02 عصر
ممنون Mahmoud.Afrad عزیز با کمک شما مشکلم رفع شد
ممنون از شما و همه دوستانی که کمک کردند.