求助:将TextBox输入保存至Settings的StringCollection代码故障排查
修复TextBox数据保存/加载到Settings StringCollection的问题
我来帮你梳理下代码里的问题,主要是控件遍历逻辑和集合初始化的位置不对,导致数据没法正常存到My.Settings.savetxt里。咱们一步步来修正:
原代码的核心问题
- 错误的控件遍历语法:
For Each TBox() As TextBox In Me.Panel1.Controls这种写法是错的,而且Panel里的控件不都是TextBox,直接强制转换会触发类型错误。 - 集合初始化重复执行:你把
savetxt的初始化放在了For Each循环内部,每次循环都会重新创建空集合,之前保存的数据直接就被覆盖了。 - 索引越界风险:保存和加载时没有确保
StringCollection的长度和TextBox数量匹配,直接按索引赋值/取值很容易触发异常。
修正后的完整代码
加载数据(LoadingData)
Sub LoadingData() ' 先初始化StringCollection(只在第一次为空的时候创建) If My.Settings.savetxt Is Nothing Then My.Settings.savetxt = New System.Collections.Specialized.StringCollection End If ' 遍历Panel里的所有控件,筛选出TextBox Dim textBoxIndex As Integer = 0 For Each ctrl As Control In Me.Panel1.Controls If TypeOf ctrl Is TextBox Then Dim tBox As TextBox = DirectCast(ctrl, TextBox) ' 确保集合有足够的元素,没有的话补空字符串 If textBoxIndex >= My.Settings.savetxt.Count Then My.Settings.savetxt.Add("") End If ' 给TextBox赋值 tBox.Text = My.Settings.savetxt(textBoxIndex) textBoxIndex += 1 End If Next End Sub
保存数据(SavingData)
Sub SavingData() ' 先初始化StringCollection(防止为空) If My.Settings.savetxt Is Nothing Then My.Settings.savetxt = New System.Collections.Specialized.StringCollection Else ' 清空旧数据,避免和新数据长度不匹配 My.Settings.savetxt.Clear() End If ' 遍历Panel里的TextBox,把文本添加到集合 For Each ctrl As Control In Me.Panel1.Controls If TypeOf ctrl Is TextBox Then Dim tBox As TextBox = DirectCast(ctrl, TextBox) My.Settings.savetxt.Add(tBox.Text) End If Next ' 保存设置 My.Settings.Save() End Sub
关键修改点说明
- 正确筛选TextBox:用
TypeOf ctrl Is TextBox判断控件类型,再用DirectCast转换,避免类型转换错误。 - 集合初始化移到循环外:只在
My.Settings.savetxt为空的时候初始化一次,不会覆盖已有数据。 - 保存时清空旧数据:避免旧数据的长度和当前TextBox数量不一致导致的索引问题,直接清空后重新添加新数据更稳妥。
- 按顺序遍历赋值:用一个计数器
textBoxIndex来对应集合的索引,确保每个TextBox的数据都能正确对应到集合的位置。
内容的提问来源于stack exchange,提问作者Raffa b
相关产品推荐
相关产品推荐

