如何解决如何在vb.net中创建级联组合框
我是编程新手,我想为一个项目创建一个层叠的组合框,但是似乎有一个逻辑错误,我似乎不知道如何解决。
Private Sub ComboBox1_SelectedindexChanged(sender As Object,e As EventArgs) Handles CSubject.SelectedindexChanged
Try
If CSubject.SelectedItem = 0 Then
CTask.Items.Clear()
If Not (CTask.Items.Contains("Bonds")) And Not (CTask.Items.Contains("TiMetables")) And Not (CTask.Items.Contains("Counting")) Then
CTask.Items.Add("Bonds")
CTask.Items.Add("TiMetables")
CTask.Items.Add("Counting")
End If
ElseIf CSubject.SelectedItem = 1 Then
CTask.Items.Clear()
If Not (CTask.Items.Contains("Phonics")) And Not (CTask.Items.Contains("Spelling")) And Not (CTask.Items.Contains("Reading")) Then
CTask.Items.Add("Phonics")
CTask.Items.Add("Spelling")
CTask.Items.Add("Reading")
End If
ElseIf CSubject.SelectedItem = 2 Then
CTask.Items.Clear()
If Not (CTask.Items.Contains("Drawing")) And Not (CTask.Items.Contains("Tracing")) And Not (CTask.Items.Contains("Colouring")) Then
CTask.Items.Add("Drawing")
CTask.Items.Add("Tracing")
CTask.Items.Add("Colouring")
End If
End If
Catch ex As Exception
End Try
End Sub
解决方法
如您在“国家”组合框中选择一个国家时所进行的级联,而“城市”组合框仅填充该国家中的城市?
我个人认为使用绑定和创建一些自定义表的最简单方法是:
- 向项目添加新的数据集
- 打开它,右键单击表面,然后选择“添加新..DataTable”
- 右键单击它或按Ctrl-L并添加..列
- 将其设为整数,称为ID,右键单击并将其设置为主键
- 添加另一个名为CountryName等的列
- 添加另一个名为“城市”的数据表
- 添加CountryId(不是主键)和CityName列
- 单击国家/地区ID左侧的灰色栏中,该行变为蓝色,然后将蓝色行拖到city中的COuntryId上,然后向左移动,在出现的对话框中确认父级为country.id,子级为city。 countryid
您现在拥有这个:
- 创建新表格
- 显示数据源窗口(视图菜单,其他窗口选项)
- 完全展开数据源中的所有节点。请注意,您有两个城市-一个位于顶层,一个嵌套在下方
- 单击城市/国家名称旁边的下拉列表,然后将其从文本框更改为组合框
- 将两个... name字段拖放到表单上,首先是国家/地区。不要放下顶层城市,而是将嵌套在国家下方的城市拖到
- 实际上,我们将撤消此处所做的某些事情,因为表单设计者并未按照我们想要的方式正确地捆绑事物,但所做的事情大部分都是有帮助的
- 在“属性”网格中,将组合的DropDownStyle更改为DropDownList
- 展开数据绑定[+],然后右键单击文本绑定,然后选择“重置”(将其删除)
- 根据组合(国家组合->国家绑定源等)将数据源设置为“国家/城市绑定源”
- 将DisplayMember设置为国家/城市名称
现在,我们只需要添加一些数据。将其放在表单的构造函数代码中(或表单加载等)
Dim r = someDataSet.Country.AddCountryRow(1,"USA")
someDataSet.City.AddCityRow(r,"New York")
someDataSet.City.AddCityRow(r,"Chicago")
r = someDataSet.Country.AddCountryRow(2,"Canada")
someDataSet.City.AddCityRow(r,"Toronto")
someDataSet.City.AddCityRow(r,"Vancouver")
就是这样;运行该应用-在框中选择“美国”,然后查看您选择的是纽约还是芝加哥。将其更改为加拿大,然后查看城市修订为多伦多/温哥华的选择
如果您想要一个实现上述步骤的完整示例项目(出于明显的原因,没有二进制文件;您必须自己构建),请下载此图片并将其重命名为.zip:
它是C#(因为那是我当时打开的代码),但是其中几乎没有代码,因为大多数工作都是可视化完成的,或者在两种语言中都是相同的(并且只针对一种{{1} },即vb和6个分号中的var
,完全相同)
不是您最初的问题的答案,因为您可以通过让编译器在运行应用程序之前检查类型错误来解决您的问题。
您可以通过使用useImmerReducer
作为主题和相关任务的数据结构来简化代码。字典将具有作为主题名称的键,而值是相关任务的集合。
使用字典,您可以按给定的主题名称Dictionary
或使用更安全的方法value = dictionary("key")
收集任务
当您看到value = dictionary.GetValueOrDefault("key","not found")
语句时-考虑使用字典,尤其是在键和值关系是动态的情况下。
if .. else
几件事要注意:
-
Option Strict On Public Class ComboBoxForm Private ReadOnly _selections As Dictionary(Of String,String()) Public Sub New() InitializeComponent() _selections = New Dictionary(Of String,String()) From { {"- not selected -",{"- not selected -"}},{"Math",{"- not selected -","Bonds","Timetables","Counting"}},{"Language","Phonics","Spelling","Reading"}},{"Art","Drawing","Tracing","Colouring"}} } cbxSubjects.DataSource = _selections.Keys.ToArray() cbxTasks.DataSource = _selections.Values.First() End Sub Private Sub CbxTasks_SelectionCommitted(sender As Object,e As EventArgs) Handles cbxSubjects.SelectionChangeCommitted Dim subjects = DirectCast(sender,ComboBox) Dim allowedTasks = _selections(subjects.SelectedValue) cbxTasks.DataSource = allowedTasks End Sub End Class
-非常重要,这可以在编译时进行类型检查 -
不要用
Option Strict On
块包装代码,抛出异常是更快发现错误的最佳工具。 -
使用
Try .. Catch
事件处理用户选择的选择。
用户更改所选项目时发生,该更改为 显示在组合框中
- 使用
SelectionChangeCommitted
将值的集合设置到ComboBox,而不是一个一个地添加它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。