View Full Version : تبدیل چندین if به دستور for each
  
نسرین2000
سه شنبه 09 اردیبهشت 1393, 09: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, 16:16 عصر
این دستورات مشکلی نداره و اجرا میشه. احتمالا باز هم مشکل وجود کاراکتر اضافه در آیتمهای لیست یا چک باکسهاست. بهتره عبارت شرط رو به صورت ctrl.text.Trim = lst.Items(i).ToString.Trim بنویسی.
نسرین2000
چهارشنبه 10 اردیبهشت 1393, 08:31 صبح
وقتی می نویسم ctrl . نقطه می ذارم خاصیت text نداره 
گزینه های دیگه ای هست مثل Get type و equals و to string ؟؟؟؟؟؟؟؟؟؟؟؟
majidnazari65
چهارشنبه 10 اردیبهشت 1393, 10:37 صبح
به دلیل  اینکه که نوع ctrl رو تعریف نکردی از نوع Object حساب میشه البته مشکلی پیش نمیاد ولی بهتره اون رو از نوع Control تعریف کنی تا خصوصیات معمول کنترلها مثل Text و Enable رو داشته باشه.
نسرین2000
چهارشنبه 10 اردیبهشت 1393, 12:08 عصر
مشکل خاصیت تکست درست شد ولی نمی دونم چرا جواب نمی ده یعنی چک باکس رو غیرفعال نمی کنه ؟؟؟
majidnazari65
چهارشنبه 10 اردیبهشت 1393, 17:36 عصر
من همین کد رو کپی پیست کردم جواب داد. برنامه رو خط به خط اجرا کن و ببین که چرا شرط اجرا نمیشه؟
Hossis
پنج شنبه 11 اردیبهشت 1393, 18: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, 11:34 صبح
سلام 
تکه کد رو که اجرا می کنم مقدرا ctrl.text برابر "رزرواسیون" است ( رزرواسیون نام فرم است !)
boveiryghasem
دوشنبه 15 اردیبهشت 1393, 09: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, 09: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, 09:16 صبح
همه کدها رو امتحان کردم عمل نمی کنه !!!!!!!!!!
نسرین2000
سه شنبه 16 اردیبهشت 1393, 09:55 صبح
trace کردم 
مقدار c را nothing می دهد !
و همچنان chbox.text را "رزرواسیون" می دهد ( رزرواسیون نام فرم است )
کسی تا حالا این کد ر امتحان کرده ؟
boveiryghasem
سه شنبه 16 اردیبهشت 1393, 13:46 عصر
selectforrezerve چیه؟ فرمه یا گروپ باکسه؟ اگر گروپ باکسه بجای  For Each c In Me.Controls باید بزاری For Each c In selectforrezerve.Controls
نسرین2000
چهارشنبه 17 اردیبهشت 1393, 08:38 صبح
نام فرم است
boveiryghasem
چهارشنبه 17 اردیبهشت 1393, 10:35 صبح
اگه نمتونی درستش کنی و مایل هستی میتونم با TeamViewer وصل بشم به سیستمت و درستش کنم خیال خودمو خودتو و دوستان و اینترنت و ... راحت کنم.؟:قهقهه:
alimanam
چهارشنبه 24 اردیبهشت 1393, 00: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, 09: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)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.