Soru VB.NET - Bir kapsayıcı nesnedeki denetimlerle yineleme


"Clear" tuşu olan bir formum var.

Kullanıcı "Temizle" yi tıkladığında, formdaki tüm görünen öğelerin değerini silmek istiyorum. Tarih kontrollerinde onları mevcut tarihe sıfırlamak istiyorum.

Tüm kontrollerim bir Panelde var.

Şu anda bunu aşağıdaki kodla yapıyorum. Her kontrol tipini manuel olarak kontrol etmekten daha kolay bir yol var mı? Bu yöntem aşırı derecede zor gözüküyor.

Sorunları daha da kötüleştirmek için, alt konteynırlardaki (yani panel içindeki bir grup kutusu) kontrolleri tekrar tekrar temizlemek için tüm canavarı aşırı yüklü bir "GroupBox" versiyonu ile tekrarlamam gerekiyor.

Düzenleme: Önerileriniz sayesinde aşağıdaki kod büyük ölçüde basitleştirilmiştir.

Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
    'User clicks Clear, so clear all the controls within this panel
    ClearAllControls(panMid, True) 'True indicates that yes, i want to recurse through sub-containers
End Sub

ClearAllControls(ByRef container As Panel, Optional Recurse As Boolean = True)   
  'Clear all of the controls within the container object
  'If "Recurse" is true, then also clear controls within any sub-containers
  Dim ctrl As Control
  For Each ctrl In container.Controls
      If (ctrl.GetType() Is GetType(TextBox)) Then
          Dim txt As TextBox = CType(ctrl, TextBox)
          txt.Text = ""
      End If
      If (ctrl.GetType() Is GetType(CheckBox)) Then
          Dim chkbx As CheckBox = CType(ctrl, CheckBox)
          chkbx.Checked = False
      End If
      If (ctrl.GetType() Is GetType(ComboBox)) Then
          Dim cbobx As ComboBox = CType(ctrl, ComboBox)
          cbobx.SelectedIndex = -1
      End If
      If (ctrl.GetType() Is GetType(DateTimePicker)) Then
          Dim dtp As DateTimePicker = CType(ctrl, DateTimePicker)
          dtp.Value = Now()
      End If

      If Recurse Then
          If (ctrl.GetType() Is GetType(Panel)) Then
              Dim pnl As Panel = CType(ctrl, Panel)
              ClearAllControls(pnl, Recurse)
          End If
          If ctrl.GetType() Is GetType(GroupBox) Then
              Dim grbx As GroupBox = CType(ctrl, GroupBox)
              ClearAllControls(grbx, Recurse)
          End If
      End If
  Next
End Sub

@Theraccoonbear: Önerinizi beğendim, ancak bu beyanı değiştirdiğimde:

Private Sub ClearAllControls(ByRef controls As ControlCollection, Optional ByVal Recurse As Boolean = True)

Sonra bu satır bana "ControlCollection" yazmak için "ControlCollection" türünde nesne düzenlenemiyor. "

  ClearAllControls(panMid.Controls)

21
2017-10-14 00:10


Menşei




Cevaplar:


GetType ve CType dansını kullanarak TryCast:

Dim dtp as DateTimePicker = TryCast(ctrl, DateTimePicker)
If dtp IsNot Nothing then dtp.Value = Now()

Bu size yaklaşık 10 satır kazandıracak.

bir uzatma yöntemi Kontrol sınıfı kapalı oldukça düzenli tutmalıdır:

<Extension()> _
Public Shared Sub ClearValue(c as Control, recursive as Boolean)
   Dim dtp as DateTimePicker = TryCast(c, DateTimePicker)
   If dtp IsNot Nothing Then dtp.Value = Now()
   ' Blah, Blah, Blah
End Sub

Düzenleme: NullReferenceExceptions'ı yok sayan Evil uzantısı yöntemlerinin düşüncesi sizi rahatsız etmiyorsa:

<Extension()> _
Public Shared Sub ClearValue(c as CheckBox)
   If c IsNot Nothing Then c.Checked = False
End Sub

TryCast(ctrl, CheckBox).ClearValue()

15
2017-10-14 00:23





Burada bir formun tüm GroupControls tüm denetimini almak için kod ve GroupBox Kontrolünde bir şeyler yapabilirsiniz

Private Sub GetControls()
    For Each GroupBoxCntrol As Control In Me.Controls
        If TypeOf GroupBoxCntrol Is GroupBox Then
            For Each cntrl As Control In GroupBoxCntrol.Controls
                'do somethin here

            Next
        End If

    Next
End Sub

7
2017-10-20 05:11





Neden sadece bir rutininiz yok

ClearAllControls(ByRef container As Control, Optional ByVal Recurse As Boolean = True)

Hiyerarşideki hangi seviyeye, çağrı seviyesinden tek bir konteynere kadar, çağrıya başladığınıza bakılmaksızın tekrar girebilirsiniz.

Ayrıca, TextBox denetimlerinde kullanıyorum Textbox.Text = String.Empty


2
2017-10-14 00:23





Benzer bir şey yaptım ve bu temelde bunu yapmaya gittim. Önem verebileceğim tek değişiklik, yöntemi aşırı yüklemek yerine yalnızca bir Kontrolde yazılır ve GroupBox, Panel veya .Controls özelliği sağlayan herhangi bir diğer konteyner denetimi için aynı sürümü kullanabilirsiniz. Bunun dışında, bir kontrolü "temizlemenin" tanımının biraz belirsiz olabileceğini düşünüyorum ve böylece Control sınıfına ait bir Clear () yöntemi yoktur, bu nedenle her bir denetim türü için amaçlarınız için anlamı ne yapmanız gerektiğini bilmeniz gerekir.


1
2017-10-14 00:17





For Each c In CONTAINER.Controls
    If TypeOf c Is TextBox Then
        c.Text = ""
    End If
Next

(KONTEYNER) sizin adınıza göre değiştirin (FORM, PANEL, GROUPBOX olabilir)
Kontrollerinizi dahil ettiğinize dikkat edin.


1
2017-12-25 18:08





İşte tüm iç kontroller için çalışıyor.
Temizlemeniz gereken başka kontroller varsa ekleyin.

Private Sub ClearAll()
    Try
        For Each ctrl As Control In Me.Controls
            If ctrl.[GetType]().Name = "Panel" Then
                ClearControls(ctrl)
            End If

            If ctrl.[GetType]().Name = "GroupBox" Then
                ClearControls(ctrl)
            End If
            If ctrl.[GetType]().Name = "ComboBox" Then
                Dim tb As ComboBox = TryCast(ctrl, ComboBox)
                tb.SelectedText = ""
            End If


            If ctrl.[GetType]().Name = "TabControl" Then
                ClearControls(ctrl)
            End If

            If ctrl.[GetType]().Name = "TextBox" Then
                Dim tb As TextBox = TryCast(ctrl, TextBox)
                tb.Clear()
            End If

            If ctrl.[GetType]().Name = "RadioButton" Then
                Dim tb As RadioButton = TryCast(ctrl, RadioButton)
                tb.Checked = False
            End If

            If ctrl.[GetType]().Name = "CheckBox" Then
                Dim tb As CheckBox = TryCast(ctrl, CheckBox)
                tb.Checked = False
            End If

            If ctrl.[GetType]().Name = "ComboBox" Then
                Dim tb As ComboBox = TryCast(ctrl, ComboBox)
                tb.SelectedIndex = 0
            End If

            If ctrl.[GetType]().Name = "RichTextBox" Then
                Dim tb As RichTextBox = TryCast(ctrl, RichTextBox)
                tb.Clear()

            End If
        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub


Private Sub ClearControls(ByVal Type As Control)

    Try
        For Each ctrl As Control In Type.Controls

            If ctrl.[GetType]().Name = "TextBox" Then
                Dim tb As TextBox = TryCast(ctrl, TextBox)
                tb.Clear()
            End If

            If ctrl.[GetType]().Name = "Panel" Then
                ClearControls(ctrl)
            End If

            If ctrl.[GetType]().Name = "GroupBox" Then
                ClearControls(ctrl)
            End If

            If ctrl.[GetType]().Name = "TabPage" Then
                ClearControls(ctrl)
            End If

            If ctrl.[GetType]().Name = "ComboBox" Then
                Dim tb As ComboBox = TryCast(ctrl, ComboBox)
                tb.SelectedText = ""
            End If

            If ctrl.[GetType]().Name = "RadioButton" Then
                Dim tb As RadioButton = TryCast(ctrl, RadioButton)
                tb.Checked = False
            End If

            If ctrl.[GetType]().Name = "CheckBox" Then
                Dim tb As CheckBox = TryCast(ctrl, CheckBox)
                tb.Checked = False
            End If

            If ctrl.[GetType]().Name = "RichTextBox" Then
                Dim tb As RichTextBox = TryCast(ctrl, RichTextBox)
                tb.Clear()

            End If
        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

1
2017-09-22 07:06





Bu doğrudan bir makale VB6'dan VB.NET'e geçerek Kontrol Dizileri'nin artık ortadan kaldırıldığı teknikleri kullanmak.

Private Sub ClearForm(ByVal ctrlParent As Control)
    Dim ctrl As Control
    For Each ctrl In ctrlParent.Controls
        If TypeOf ctrl Is TextBox Then
           ctrl.Text = ""
        End If
        ' If the control has children, 
        ' recursively call this function
        If ctrl.HasChildren Then
            ClearForm(ctrl)
        End If
    Next
End Sub

1
2018-02-07 16:55





Public Sub raz (ControlControlCollection, isteğe bağlı olarak Boolean = True)

        For Each ctrl As Control In lst

            If TypeOf ctrl Is TextBox Then
                CType(ctrl, TextBox).Clear()
            End If


            If TypeOf ctrl Is MaskedTextBox Then
                CType(ctrl, MaskedTextBox).Clear()
            End If

            If TypeOf ctrl Is ComboBox Then
                CType(ctrl, ComboBox).SelectedIndex = -1
            End If

            If TypeOf ctrl Is DateTimePicker Then
                Dim dtp As DateTimePicker = CType(ctrl, DateTimePicker)
                dtp.CustomFormat = " "
            End If

            If TypeOf ctrl Is CheckedListBox Then
                Dim clbox As CheckedListBox = CType(ctrl, CheckedListBox)
                For i As Integer = 0 To clbox.Items.Count - 1
                    clbox.SetItemChecked(i, False)
                Next
            End If

            If TypeOf ctrl Is RadioButton Then
                CType(ctrl, RadioButton).Checked = False

            End If

            If recursive Then
                If TypeOf ctrl Is GroupBox Then
                    raz(CType(ctrl, GroupBox).Controls)
                End If
            End If






        Next
    End Sub

1
2018-04-13 17:52



Mehod için çağrı: raz (Me.Controls) - user3692282
Sadece kod çözümleri göndermemeye çalışın. - NathanOliver
Tamam, ama bence yukarıdaki soru için bu bir çözüm değil mi? - user3692282


Seni tanıtıyorum ControlIterator Sınıf

Kaynak: http://pastebin.com/dubt4nPG

Bazı kullanım örnekleri:

 ControlIterator.Disable(CheckBox1)

 ControlIterator.Enable({CheckBox1, CheckBox2})

 ControlIterator.Check(Of CheckBox)(Me)

 ControlIterator.Uncheck(Of CheckBox)(Me.GroupBox1)

 ControlIterator.Hide(Of CheckBox)("1")

 ControlIterator.PerformAction(Of CheckBox)(Sub(ctrl As CheckBox) ctrl.Visible = True)

 ControlIterator.AsyncPerformAction(RichTextBox1,
                                    Sub(rb As RichTextBox)
                                        For n As Integer = 0 To 9
                                            rb.AppendText(CStr(n))
                                        Next
                                    End Sub)

 ControlIterator.PerformAction(Me.Controls, Sub(c As Control)
                                                c.BackColor = Color.Green
                                            End Sub)

0
2018-02-21 12:40