PDA

View Full Version : تغییر رنگ کنترل ها از داخل یک روال Shared



tabatabaeefar
جمعه 05 اسفند 1390, 18:13 عصر
سلام
من توی برنامه ای که دارم میسازم 8 تا دکمه دارم که برای این کار یه دونه یورزکنترل ساختم.
میخوام رنگ آخرین دکمه ایی که کلیک میشه با بقیه متفاوت باشه (درحالت طبیعی دکمه ها خاکستری هستن و آخرین دکمه ایی که کلیک میشه باید قرمز باشه).
میشه این کار رو توی کد برنامه انجام بدم اما دوست دارم خود کنترل این قابلیت رو داشته باشه.
خواستم از یک روال Shared داخل یوزرکنترل استفاده کنم و موقع کلیک رنگ همه دکمه ها رو به خاکستری تغییر بدم و دکمه کلیک شده رو قرمز کنم. نتونستم از داخل روال Shared به کنترل های تشکیل دهنده یوزرکنترل دسترسی داشته باشم.
لطفا کمکم کنید.

فرید نجفلو
جمعه 05 اسفند 1390, 21:07 عصر
کاش شما کد تون رو می زاشتید تا ما ایرداش رو می گفتیم
ولی در حالت کلی باید متد شما باید حداقل یک پارامتر بگیره که اونم کنترل شماست و این پارامتر هم باید با Byref تعریف بشه
Public Sheared Sub ChangeBtnColor(Byref usrControl as myControl)

tabatabaeefar
جمعه 05 اسفند 1390, 22:24 عصر
من قصد دارم از داخل روال Shared رنگ رو تغییر بدم تا رنگ همه تغییر بکنه (خاکستری بشه)
اما از داخل روال های Shared فقط میشه اعضای Shared رو تغییر داد و سایر اعضا قابل تغییر نیستند.

فرید نجفلو
جمعه 05 اسفند 1390, 22:41 عصر
دوست عزیز شما 6 عدد دکمه به فرم اضافه و کد زیر رو داخل اون اجرا کنید ببینید منظور من و شما یکیه!
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
CheangAllColor(Me)
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click
ChangeColor(sender)
End Sub
Public Shared Sub ChangeColor(btn As Button)
btn.BackColor = Color.Red
End Sub
Public Shared Sub CheangAllColor(frm As Form)
For Each Ctrl In frm.Controls
If TypeOf Ctrl Is Button Then
Ctrl.BackColor = Color.Blue
End If
Next
End Sub

tabatabaeefar
جمعه 05 اسفند 1390, 22:57 عصر
ممنون که وقت گذاشتید.
نمیخواستم از این راه استفاده کنم.
میخوام داخل خود یوزرکنترل طوری کد بنویسم که نیازی به کد نویسی توی برنامه اصلی نباشه.

فرید نجفلو
جمعه 05 اسفند 1390, 23:27 عصر
ببینید فرقی نمی کنه!
شما فرض کنید آین فرم همون کنترل شماست شما اون دو تا متد Shared رو داخل یوزر کنترل تون می زارید و مثل من پارامتر ها رو بهش می فرستید
به استفاده از متد CheangAllColor دقت کنید. اگه از داخل اون بخواهید از Me استفاده کنید خطا میگیره واسه همین با اینکه متد داخل فرمه ولی من خود فرم یعنی Me رو به عنوان پارامتر براش فرستادم.
شما هم درست باید همین کار رو بکنید
اگه باز چایی ابهام دارید بفمایید من در خدمتم

tabatabaeefar
شنبه 06 اسفند 1390, 01:16 صبح
ممنون از اینکه وقت میذارید.
یا من منظور شما رو متوجه نمیشم و یا شما منظور من رو متوجه نشدید.
من میخوام وقتی روی کنترل کلیک میشه، رنگ همه کنترل های از اون نوع تغییر بکنه بدون اینکه کدی توی فرم اصلی نوشته بشه.
اگر براتون امکانش هست لطفا یه کنترل خیلی ساده بسازید که این قابلیت رو داشته باشه.
باز هم ممنون.

فرید نجفلو
شنبه 06 اسفند 1390, 11:16 صبح
این یوزر کنترل شما چه طور یه؟
یعنی شما یه یوزر کنترل ساختین که توش 8 تا دکمه داره و شما برای اینکه تو فرم مجبور نباشید 8 تا دکمه رو یکی یکی بندازید توش از اون استفاده می کنید(درست متوجه شدم؟)
البته بهتر بود اون چیزی رو که ساختین یا یک نمونه ساده شو می دادین تا ما همون رو براتون اصلاح می کردیم

tabatabaeefar
شنبه 06 اسفند 1390, 20:38 عصر
ممنون آقای نجفلو که وقت گذاشتید.
منظور من رو خوب متوجه نشده بودید :لبخند:
من یه یوزرکنترل دکمه ساختم و در برنامه 8 بار از اون استفاده کردم.
خودم به نتیجه رسیدم.
برنامه رو میذارم شاید به درد بقیه دوستان هم بخوره.
باز هم از شما ممنونم.

mostafaaa
شنبه 06 اسفند 1390, 21:17 عصر
try this
Private Sub UserControl1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
For Each ctrl As Control In sender.parent.controls
If TypeOf ctrl Is UserControl1 Then
ctrl.BackColor = Color.White
End If
Next
Me.BackColor = Color.Red
End Sub

فرید نجفلو
شنبه 06 اسفند 1390, 21:18 عصر
به به آقای طبابایی فر دیگه شما چرا؟!!
روی مسئله رو پاک کردین؟!!
خوب حالا کنترل شما پیشرفته تر شد و چند تا کنترل دیگه بهش اضافه شد یا خواستید یک متن هم توش نشون بدید اون وقت هم یه برچسب می ندازید رو بقیه کنترل ها؟!
و اینم رو هم می دونستید که اگه از این کنترل در چند پنجره دیگه استفاده کنید کلیک کنترل در یکی روی بقیه پنجره ها هم اثر می زاره(در کل برنامت فقط می تونی یک یک دکمه با زمینه قرمز داشته باشی!)
پیشنهاد من اینه (نظرت چیه؟)
هیچ چیز Share هم نمی خواد و با این روش پنجره که سهله اگه کنترل ها در Tab یا Panel جداگانه هم باشند روی هم تعثیر نمی زارن


Public Class UserControl1
Private Sub UserControl1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Dim MyParent = Me.Parent
For Each Ctrl In MyParent.Controls
If TypeOf Ctrl Is UserControl1 Then
CType(Ctrl, UserControl1).BackColor = SystemColors.ActiveCaption
End If
Next
CType(sender, UserControl1).BackColor = Color.Red
End Sub
End Class