VB.NET - 迭代容器对象中的控件

2023-12-31

我有一个带有“清除”按钮的表单。

当用户单击“清除”时,我想清除表单上所有可见元素的值。对于日期控件,我想将它们重置为当前日期。

我的所有控件都包含在面板上。

现在,我正在使用以下代码执行此操作。有没有比手动检查每种控件类型更简单的方法?这种方法似乎过于笨拙。

更糟糕的是,为了递归地清除子容器内的控件(即面板内的组框),我必须使用重载的“GroupBox”版本来重复整个怪物。

编辑:感谢您的建议,下面的代码大大简化了。

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

@Theracoonbear:我喜欢你的建议,但是当我将声明更改为:

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

然后这一行给我“无法将类型'ControlCollection'的对象转换为类型'ControlCollection'。”:

  ClearAllControls(panMid.Controls)

您可以跳过 GetType 和 CType 之舞TryCast http://msdn.microsoft.com/en-us/library/zyy863x8(VS.80).aspx:

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

这将为您节省大约 10 行代码。

An 扩展方法 http://msdn.microsoft.com/en-us/library/bb384936.aspx离开 Control 类应该保持它非常整洁:

<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

编辑:如果忽略 NullReferenceExceptions 的邪恶扩展方法的想法不会让您感到畏缩:

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

TryCast(ctrl, CheckBox).ClearValue()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB.NET - 迭代容器对象中的控件 的相关文章

  • 将 DotNetZip ZipFile 转换为字节数组

    我已经构建了一个包含多个条目的 DotNetZip ZipFile 我想将其转换为字节数组 以便我可以使用下面的下载结构下载它 Using wrkZip As New ZipFile create zip add memory stream
  • 尝试添加注册表项时出现未处理的异常

    当我使用以下代码时 My Computer Registry LocalMachine OpenSubKey SOFTWARE Microsoft Windows CurrentVersion Run True SetValue Appli
  • VB.NET会自动生成ComClass属性和guid吗?

    我运行过一些 VB NET 代码 这些代码显式创建三个 GUID 常量并在类的 ComClass 属性中使用它们 我过去只是通过检查项目选项中的 使 COM 可见 和 注册 COM 互操作 选项来编写 COM 感知类 这个显式代码是否根本没
  • Windows 服务应用程序中自托管 ASP.NET Web API 的问题

    我在网上看到了一些文章 描述了如何在 Windows 服务应用程序中自行托管 ASP NET Web API 请参阅here http www piotrwalat net hosting web api in windows servic
  • 如何在 XAML/WPF 中存储和检索多个形状?

    使用 XAML WPF 做一些简单的事情似乎遇到了很多问题 我已经使用矩形和椭圆形等形状创建了一些基于 XAML 的图像来创建我需要应用程序的其他部分使用的图标 但我不能似乎找到了如何做到这一点 我似乎能够在资源字典中存储画布 但无法在任何
  • vb.net:查找字符串中字符串的位置?

    vb net 中是否使用 instr 来实现此目的 使用 String IndexOf http msdn microsoft com en us library system string indexof aspx http msdn m
  • 如何使用 VB.NET 以编程方式在 Richtextbox 中添加粗体文本

    我有这个代码 print text Text Patient number ds Tables patients Rows 0 Item 0 print text AppendText Environment NewLine print t
  • 读取 .ini 文件 vb.net?

    我有一个具有读取 ini 文件功能的项目 我无法显示我想要的 ini 文件的内容 我的代码读取 ini 文件 Public Function GetSettingItem ByVal File As String ByVal Identif
  • 使用 Canon EDSDK 2.5.2 VB.NET 实时查看

    我正在尝试做两件事中的一件 第一件事 使用 VB NET 和 Canon EDSDK 2 5 2 打开实时视图 并在 Windows 窗体应用程序中渲染实时输出 目前我正在尝试将其放入图片框 不过 我肯定愿意接受建议 第二个选项是至少打开实
  • VB 中的 xml 注释还可以自定义吗?

    从 Visual Studio 2005 开始 我们可以将名为 VBXMLDoc xml 的文件复制到路径中 C Users user AppData Roaming Microsoft VisualStudio version 定义可用于
  • .Net 2 迭代器的巧妙使用[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 C 2 和 VB Net 8 引入了一项新功能 称为迭代器 http msdn microsoft com en us library dscy
  • 比较两个字符串ArrayList

    我有两个数组列表 dim Colors1 New ArrayList Colors1 Add Blue Colors1 Add Red Colors1 Add Yellow Colors1 Add Green Colors1 Add Pur
  • 通过 USB 将原始文本发送到打印机

    我正在尝试将 ZPL 命令发送到 Zebra ZT230 打印机 打印机和驱动程序已安装 打印机端口为 USB003 PC 通过 Zebra 打印机设置实用程序或 ZebraDesign 与打印机完美通信 我尝试了以下代码 Private
  • 将列表拆分为多个部分 - VB 转换失败

    尝试编写一种将列表拆分为子列表的方法 Private Function SplitIdsIntoChunks ByVal keys As List Of String As List Of List Of String Return key
  • 拆分容器,制作固定面板

    我有一个水平方向的 splitcontainer 我希望仅在表单调整大小期间为 panel2 设置固定高度 并让 splitter 调整 panel2 大小 现在我正在这样做 但我不满意 因为用户注意到面板调整了大小 Private Sub
  • 如何将 POST 请求内容保存为 .NET 中的文件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个客户端应用程序POST请求a
  • vb.net 中的简单 rot13 编码器

    我正在寻找一种简单的方法将输入的文本编码为 Rot13 在能够将单词分离为单个字符和整数以便我可以更改每个字符并输出结果的阶段 我遇到了困难 我可以使用下面列出的简单 if 语句来使用单个字母来完成此操作 但如果有人可以帮助找到整个单词的方
  • 增加超时时间

    我必须增加超时时间 以下是我的代码 Private Function GetConnectionInstance As SqlConnection Dim objConn As SqlConnection Dim strConnection
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • VB.NET 密码哈希函数的 PHP 等效项 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有以下 Visual Basic NET 函数 用于生成存储在内部数据库中的密码哈希值 Public Function HashPass

随机推荐

  • 尽管 Oracle.DataAccess.dll 安装在 GAC 中,但它未显示在资源管理器中

    有谁知道为什么我的 Oracle DataAccess dll 版本 4 程序集未显示在资源管理器视图中 它已安装在 GAC 中并且运行没有任何问题 gacutil按预期显示 C Program Files x86 Microsoft Vi
  • OpenGL C# (OpenTK) 加载和绘制图像功能不起作用

    我正在尝试在屏幕上加载并显示纹理 但是我收到了一个黑框 它应该显示在其中 两个主要方法是 LoadTexture 和 Draw Image 我假设错误在于其中之一 using System using System Diagnostics
  • stdClass 对象和 foreach 循环

    我正在使用以下代码通过 Soap 从网站获取数据 client new SoapClient http some url here class SMSParam public CellNumber public AccountKey pub
  • 如何在 JFreeChart 中将点转换为线?

    我在将 JFreeChart 生成的点转换为线时遇到问题 首先 有一些资料确实帮助我达到了这一点 使用 JfreeChart 动态向 XYSeries 添加点 https stackoverflow com questions 720574
  • Tomcat gzip while chunked 问题

    我的一项数据源服务遇到了一些问题 正如 HTTP 响应标头中所述 它在 Apache Coyote 1 1 上运行 服务器给出带有 Transfer Encoding chunked 的响应 这里是示例响应 HTTP 1 1 200 OK
  • 为什么 Ajax 脚本无法在 IIS 7.5 Win 2008 R2 服务器上运行?

    我有一个 Web 应用程序在我的开发服务器上的 VS 2013 上运行良好 但是一旦我将其发布到 IIS 7 5 2008 R2 服务器上 位于我的自定义脚本文件中的 Ajax 脚本就不再工作了 尽管其他 JQuery 脚本不调用 Ajax
  • Monotouch/WCF:如何在不使用 svcutil 的情况下使用 wcf 服务

    由于monotouch编译为本机代码 因此它有一些限制 例如不允许动态调用 但我在 net中有很多类 我使用 ChannelFactory 动态来调用 wcf 服务 new ChannelFactory myBinding myEndpoi
  • 如何以编程方式拦截 GC 以将信息打印到我的日志中

    我知道您可以使用 verbosegc 将有关 GC 的信息打印到 sysout 但我不希望这样做 我想在 GC 触发时进行拦截 并将有关它的信息打印到我的自定义记录器 也许将最后一次 GC 时间戳保存在内部变量上 等等 这里还有希望吗 您无
  • 单击地图时关闭信息框

    我正在使用 Google Maps V3 API 的 Infobox 插件 http google maps utility library v3 googlecode com svn trunk infobox docs referenc
  • Visual Studio 2013,TFS 非常慢

    当我最初安装 VS Ultimate 2013 时 一切都很好 但在上个月左右的时间里 它一直很糟糕 我的 Visual Studio 2013 安装中的源代码管理浏览非常慢 只需单击一个节点 显示该节点内容的操作就需要 20 多秒 团队中
  • 从sql plus中的字符串中删除最后一个字符

    我试图从 sql plus 的列输出中删除最后一个字符 列条目的长度不固定 例如 XYZA 应输出为 XYZ 我尝试过使用substr 功能 但似乎不起作用 SUBSTR ooo CO NAME 1 LENGTH ooo CO NAME 1
  • 如何使用 sed 命令在模式字符串之前添加字符串?

    我想使用 sed 修改名为 baz 的文件 当我搜索模式 foo 时 foo 不在行首或行尾 我想在 foo 之前附加 bar 我该如何使用 sed 来做到这一点 Input file named baz blah foo blahblah
  • 在 flutter 中通过 Function(T) 传递泛型类型

    我正在尝试创建一个通用的消费者小部件 以方便其子视图模型 因此我有两个功能 一个在 ViewModel 初始化之后有一个函数 T 另一个用于将模型传递给它的子 Widget 通用类中是 ChangeNotifier 的子级 在我想在两个函数
  • 带有 ActionBarSherlock 的本机 ActionBar selectableItemBackground

    我尝试更改操作栏中所选项目的背景 我使用 ActionBarSherlock 来与旧版 Android 版本兼容 当应用程序在带有 ICS 的设备上运行时 我为我的 Activity 设置了特定主题 这是我目前的风格
  • 变换所有子视图

    我在滚动视图中有一个 UIView 其中包含大约 100 个子视图 子视图看起来都一样 并且是同一类的实例 我有一个要应用于每个子视图的转换 但每次 ZoomScale 改变时 变换都需要改变 将变换应用于所有视图的最佳方法是什么 目前我正
  • 更改 IOS Xamarin Forms 中的开关颜色

    如何在切换 IOS Xamarin Forms 时更改切换按钮的颜色 自定义渲染将仅设置颜色一次 Xamarin 表单切换按钮在 IOS 上的默认颜色 https stackoverflow com questions 38993959 x
  • 如何限制bash中函数中使用的线程/子进程的数量

    我的问题是如何更改此代码 使其仅使用 4 个线程 子进程 TESTS a b c d e for f in TESTS do t RANDOM 5 1 sleep t echo f t done wait 有趣的问题 我尝试使用 xargs
  • 使用 JSON 字符串填充表布局

    我的 Web 服务返回一个 JSON 字符串 如下所示 checkrecord rollno abc2 percentage 40 attended 12 missed 34 Table1 上面的字符串代表我的数据集 我已将字符串转换为 J
  • Fluent NHibernate 集合每个子类表

    我在 Fluent NHibernate 中的继承方面遇到问题 我之前已经设法让 Table Per Subclass 工作 但我无法让基类的集合工作 它正在寻找一个我没有的基类表 这是我的架构 User Id Name Email Use
  • VB.NET - 迭代容器对象中的控件

    我有一个带有 清除 按钮的表单 当用户单击 清除 时 我想清除表单上所有可见元素的值 对于日期控件 我想将它们重置为当前日期 我的所有控件都包含在面板上 现在 我正在使用以下代码执行此操作 有没有比手动检查每种控件类型更简单的方法 这种方法