PDA

View Full Version : تبدیل چندین if به دستور for each



نسرین2000
سه شنبه 09 اردیبهشت 1393, 08:10 صبح
سلام
فرمی دارم که 23 تا چک باکس به نامهای ch1 تا ch23 و خاصیت تکست آنها 1 تا 23 هست .
یک لیست باکس هم دارم .
حالا می خوام یکی یکی آیتم های لیست باکس را چک کنم و اگر آیتمی از لیست باکس برابر خاصیت تکست یکی از چک باکس ها بود آن چک باکس را غیر فعال کنم .
برای روشن شدن مطلب مثالی بزنم مثلا یکی از آیتم های لیسا باکس 15 است بنابراین باید چک باکسی که خاصیت تکست آن 15 استت غیر فعال شود .
بریا این کار باید 23 تا شرط if بنویسم به صورت زیر :


For i = 0 To lst.Items.Count - 1
If lst.Items(i) = 1 Then
ch1.enable = False
Else
If lst.Items(i) = 2 Then
ch2.enable = False
End If
End If
Next

حالا می خوام با دستور for each به صورت زیر از به کار بردن این 23 تا شرط جلوگیری کنم کدم را به صورت زیر می نویسم ولی اجرا نمی شود البته خطا هم نمی دهد :

For i = 0 To lst.Items.Count - 1
For Each ctrl In selectforrezerve.Controls
If TypeOf ctrl Is CheckBox Then
If ctrl.text = lst.Items(i) Then
ctrl.Enabled = False
End If
End If
Next
Next

majidnazari65
سه شنبه 09 اردیبهشت 1393, 15:16 عصر
این دستورات مشکلی نداره و اجرا میشه. احتمالا باز هم مشکل وجود کاراکتر اضافه در آیتمهای لیست یا چک باکسهاست. بهتره عبارت شرط رو به صورت ctrl.text.Trim = lst.Items(i).ToString.Trim بنویسی.

نسرین2000
چهارشنبه 10 اردیبهشت 1393, 07:31 صبح
وقتی می نویسم ctrl . نقطه می ذارم خاصیت text نداره
گزینه های دیگه ای هست مثل Get type و equals و to string ؟؟؟؟؟؟؟؟؟؟؟؟

majidnazari65
چهارشنبه 10 اردیبهشت 1393, 09:37 صبح
به دلیل اینکه که نوع ctrl رو تعریف نکردی از نوع Object حساب میشه البته مشکلی پیش نمیاد ولی بهتره اون رو از نوع Control تعریف کنی تا خصوصیات معمول کنترلها مثل Text و Enable رو داشته باشه.

نسرین2000
چهارشنبه 10 اردیبهشت 1393, 11:08 صبح
مشکل خاصیت تکست درست شد ولی نمی دونم چرا جواب نمی ده یعنی چک باکس رو غیرفعال نمی کنه ؟؟؟

majidnazari65
چهارشنبه 10 اردیبهشت 1393, 16:36 عصر
من همین کد رو کپی پیست کردم جواب داد. برنامه رو خط به خط اجرا کن و ببین که چرا شرط اجرا نمیشه؟

Hossis
پنج شنبه 11 اردیبهشت 1393, 17:53 عصر
فکر کنم حلقه for اول لازم نباشه
این طور بنویسید شاید حل بشه

For Each ctrl as object In selectforrezerve.Controls
If TypeOf ctrl Is CheckBox Then
If lst.Items.contains( ctrl.text) Then
ctrl.Enabled = False
End If
End If
Next

نسرین2000
شنبه 13 اردیبهشت 1393, 10:34 صبح
سلام
تکه کد رو که اجرا می کنم مقدرا ctrl.text برابر "رزرواسیون" است ( رزرواسیون نام فرم است !)

boveiryghasem
دوشنبه 15 اردیبهشت 1393, 08:14 صبح
درود بر دوستان.

با این کد روی هر آیتمی توی ListBox کلیک کنی هر CheckBox رو که خاصیت text اون با آیتم توی ListBox برابر باشه رو غیرفعال میکنه.

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Dim c As Object
For Each c In Me.Controls
If TypeOf (c) Is CheckBox Then
Dim chBox As CheckBox = CType(c, CheckBox)
If ListBox1.Items(ListBox1.SelectedIndex) = chBox.Text Then
chBox.Enabled = False
End If
Exit For
End If
Next
End Sub

boveiryghasem
دوشنبه 15 اردیبهشت 1393, 08:17 صبح
با این کد هم میتونی با یه باتن یه هویی همشون رو پیدا کنی:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As Object
For Each c In Me.Controls
If TypeOf (c) Is CheckBox Then
Dim chBox As CheckBox = CType(c, CheckBox)
For i = 0 To ListBox1.Items.Count - 1
If ListBox1.Items(i) = chBox.Text Then
chBox.Enabled = False
End If
Next
End If
Next
End Sub

نسرین2000
سه شنبه 16 اردیبهشت 1393, 08:16 صبح
همه کدها رو امتحان کردم عمل نمی کنه !!!!!!!!!!

نسرین2000
سه شنبه 16 اردیبهشت 1393, 08:55 صبح
trace کردم
مقدار c را nothing می دهد !
و همچنان chbox.text را "رزرواسیون" می دهد ( رزرواسیون نام فرم است )
کسی تا حالا این کد ر امتحان کرده ؟

boveiryghasem
سه شنبه 16 اردیبهشت 1393, 12:46 عصر
selectforrezerve چیه؟ فرمه یا گروپ باکسه؟ اگر گروپ باکسه بجای For Each c In Me.Controls باید بزاری For Each c In selectforrezerve.Controls

نسرین2000
چهارشنبه 17 اردیبهشت 1393, 07:38 صبح
نام فرم است

boveiryghasem
چهارشنبه 17 اردیبهشت 1393, 09:35 صبح
اگه نمتونی درستش کنی و مایل هستی میتونم با TeamViewer وصل بشم به سیستمت و درستش کنم خیال خودمو خودتو و دوستان و اینترنت و ... راحت کنم.؟:قهقهه:

alimanam
سه شنبه 23 اردیبهشت 1393, 23:19 عصر
با سلام

از کد زیر استفاده کنید مشکلتون حل میشه .


For Each item As Object In ListBox1.Items
For Each _checkbox As Object In Me.Controls
If TypeOf (_checkbox) Is CheckBox Then
If _checkbox.Text = item.ToString Then _checkbox.Enabled = False
End If
Next
Next


موفق باشید./

rahnema1
چهارشنبه 24 اردیبهشت 1393, 08:12 صبح
این جور هم میشه نوشت:

Imports System.Linq
'...
'...
Dim chbx As List(Of Control) = Me.Controls.Cast(Of Control)().Where(Function(c) c.[GetType]() Is GetType(CheckBox)).[Select](Function(c) c).OrderBy(Function(c) Integer.Parse(c.Text)).ToList()
chbx.[Select](Function(c) c.Text).Intersect( lst.Items. Cast(Of String)()).ToList().ForEach(Sub( p As String ) chbx(Integer.Parse(p) - 1).Enabled= False)