2008-10-14 39 views
21

Tôi có biểu mẫu có nút "Xóa".VB.NET - Lặp lại thông qua các điều khiển trong đối tượng vùng chứa

Khi người dùng nhấp vào "Xóa", tôi muốn xóa giá trị của tất cả các thành phần hiển thị trên biểu mẫu. Trong trường hợp điều khiển ngày, tôi muốn đặt lại chúng cho ngày hiện tại.

Tất cả các điều khiển của tôi đều có trong Bảng điều khiển.

Hiện tại, tôi đang làm điều này với mã bên dưới. Có cách nào dễ hơn kiểm tra thủ công đối với từng loại điều khiển không? Phương pháp này dường như quá khó sử dụng.

Để làm cho vấn đề tồi tệ hơn, để đệ quy xóa các điều khiển bên trong các thùng chứa con (ví dụ: hộp nhóm trong bảng điều khiển), tôi phải lặp lại toàn bộ con quái vật với phiên bản "GroupBox" quá tải.

Chỉnh sửa: Nhờ các đề xuất của bạn, mã bên dưới được đơn giản hóa rất nhiều.

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: Tôi thích đề nghị của bạn, nhưng khi tôi thay đổi tuyên bố như sau:

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

Sau đó, dòng này mang lại cho tôi "Unable to cast đối tượng của loại 'ControlCollection' gõ ' ControlCollection '. ":

ClearAllControls(panMid.Controls) 

Trả lời

15

Bạn có thể bỏ qua GetType và CType khiêu vũ với TryCast:

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

Điều đó sẽ giúp bạn tiết kiệm khoảng 10 dòng.

Một extension method ra khỏi lớp học kiểm soát nên giữ nó khá gọn gàng:

<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 

Edit: Nếu ý nghĩ về phương pháp khuyến nông ác mà bỏ qua NullReferenceExceptions không làm cho bạn co rúm người lại:

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

TryCast(ctrl, CheckBox).ClearValue() 
1

Tôi đã làm điều gì đó tương tự và về cơ bản là tôi đã thực hiện nó như thế nào. Thay đổi duy nhất tôi có thể đề nghị sẽ thay vì quá tải phương thức, chỉ cần thực hiện việc chuyển đổi trong loại Điều khiển và bạn có thể sử dụng cùng phiên bản cho GroupBox, Bảng điều khiển hoặc bất kỳ điều khiển vùng chứa nào khác cung cấp thuộc tính .Controls. Ngoài ra, tôi nghĩ định nghĩa "thanh toán bù trừ" một điều khiển có thể hơi mơ hồ và do đó không có phương thức Clear() thuộc lớp Control nên bạn cần phải thực hiện ý nghĩa của nó cho từng loại điều khiển.

2

Tại sao không chỉ có một quy tắc thông thường

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

Bạn có thể recurse i tùy theo cấp độ nào trong hệ thống phân cấp mà bạn bắt đầu cuộc gọi, từ mức biểu mẫu xuống đến một vùng chứa duy nhất.

Ngoài ra, trên các điều khiển TextBox, tôi sử dụng Textbox.Text = String.Empty

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

Thay thế (CONTAINER) bằng tên của bạn (có thể là một MẪU, một PANEL, một GroupBox) chú ý
Pay mà bạn đã bao gồm các điều khiển của bạn.

1

Ở đây nó hoạt động với tất cả các điều khiển bên trong.
Thêm nếu bạn có bất kỳ điều khiển nào khác cần xóa.

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 
7

đây là đoạn code để có được tất cả các kiểm soát của một người mẫu Tất cả GroupControls và bạn có thể làm điều gì đó trong Control GroupBox

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 
0

này xuất phát trực tiếp từ một article kỹ thuật thảo luận để sử dụng tại điều đó Mảng đã được thực hiện đi với đi từ VB6 đến VB.NET.

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 
0

tôi giới thiệu bạn ControlIterator Lớp tôi

Nguồn: http://pastebin.com/dubt4nPG

Một số ví dụ sử dụng:

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

Public Sub raz (lst Như Control.ControlCollection, đệ quy bắt buộc As Boolean = Đúng)

 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 
+0

gọi cho mehod: raz (Me.Controls) – user3692282

+0

Cố gắng không đăng các giải pháp chỉ mã. – NathanOliver

+0

ok, nhưng, tôi nghĩ rằng đây là một giải pháp cho câu hỏi trên, phải không? – user3692282

Các vấn đề liên quan