Vb.net For循环遍历windows窗体中的所有CheckedListBox
我已经为我的问题找到了解决方案,但处理起来太长了。 我想得到一些帮助,我可以循环检查表单中的所有10个checkedListBox,以便每一个都填充datagridview的一列。 这是我的密码 第一段代码:Vb.net For循环遍历windows窗体中的所有CheckedListBox,vb.net,checkedlistbox,Vb.net,Checkedlistbox,我已经为我的问题找到了解决方案,但处理起来太长了。 我想得到一些帮助,我可以循环检查表单中的所有10个checkedListBox,以便每一个都填充datagridview的一列。 这是我的密码 第一段代码: Dim dt As New DataTable dt.Columns.Add("Região", Type.GetType("System.String")) dt.Columns.Add("Produto", Type.GetType("System.String")) dt.Colum
Dim dt As New DataTable
dt.Columns.Add("Região", Type.GetType("System.String"))
dt.Columns.Add("Produto", Type.GetType("System.String"))
dt.Columns.Add("Cliente", Type.GetType("System.String"))
dt.Columns.Add("Tipo Atividade", Type.GetType("System.String"))
dt.Columns.Add("Acabamento", Type.GetType("System.String"))
dt.Columns.Add("Cores", Type.GetType("System.String"))
dt.Columns.Add("Gramagem", Type.GetType("System.String"))
dt.Columns.Add("Tipo Embalagem", Type.GetType("System.String"))
dt.Columns.Add("Formatos", Type.GetType("System.String"))
dt.Columns.Add("Contagem", Type.GetType("System.String"))
dt.Columns.Add("Transporte", Type.GetType("System.String"))
dt.Columns.Add("Moeda", Type.GetType("System.String"))
dt.Columns.Add("Preço", Type.GetType("System.String"))
dt.Columns.Add("Data Inicio", Type.GetType("System.String"))
dt.Columns.Add("Data Fim", Type.GetType("System.String"))
dt.Columns.Add("Standard", GetType(Boolean))
Dim dataInicio, dataFim As String
dataInicio = DateTimeInicio.Value.ToString("dd-MM-yyyy")
dataFim = DateTimeFim.Value.ToString("dd-MM-yyyy")
Dim a, b, c, d, f, g, h, i, j, k As Integer
Dim dr As DataRow = dt.NewRow
第二段代码:
For a = 0 To ChkListRegiao.Items.Count - 1
For b = 0 To ChkListProduto.Items.Count - 1
For c = 0 To ChkListTipoAtividade.Items.Count - 1
For d = 0 To ChkListAcabamento.Items.Count - 1
For f = 0 To ChkListCores.Items.Count - 1
For g = 0 To ChkListGramagem.Items.Count - 1
For h = 0 To ChkListTipoEmbalagem.Items.Count - 1
For i = 0 To ChkListFormatos.Items.Count - 1
For j = 0 To ChkListContagem.Items.Count - 1
For k = 0 To ChkListTransporte.Items.Count - 1
dr("Região") = ChkListRegiao.GetItemChecked(a)
dr("Produto") = ChkListProduto.GetItemChecked(b)
dr("Cliente") = ""
dr("Tipo Atividade") = ChkListTipoAtividade.GetItemChecked(c)
dr("Acabamento") = ChkListAcabamento.GetItemChecked(d)
dr("Cores") = ChkListCores.GetItemChecked(f)
dr("Gramagem") = ChkListGramagem.GetItemChecked(g)
dr("Tipo Embalagem") = ChkListTipoEmbalagem.GetItemChecked(h)
dr("Formatos") = ChkListFormatos.GetItemChecked(i)
dr("Contagem") = ChkListContagem.GetItemChecked(j)
dr("Transporte") = ChkListTransporte.GetItemChecked(k)
dr("Moeda") = txtMoeda.Text
dr("Preço") = txtPrecoTon.Text
dr("Data Inicio") = dataInicio
dr("Data Fim") = dataFim
dr("Standard") = chkStandard.Checked
If ChkListRegiao.GetItemChecked(a) And ChkListProduto.GetItemChecked(b) And ChkListTipoAtividade.GetItemChecked(c) And
ChkListAcabamento.GetItemChecked(d) And ChkListCores.GetItemChecked(f) And ChkListGramagem.GetItemChecked(g) And
ChkListTipoEmbalagem.GetItemChecked(h) And ChkListFormatos.GetItemChecked(i) And ChkListContagem.GetItemChecked(j) And
ChkListTransporte.GetItemChecked(k) Then
dt.Rows.Add(ChkListRegiao.Items(a), ChkListProduto.Items(b), "", ChkListTipoAtividade.Items(c), ChkListAcabamento.Items(d), ChkListCores.Items(f),
ChkListGramagem.Items(g), ChkListTipoEmbalagem.Items(h), ChkListFormatos.Items(i),
ChkListContagem.Items(j), ChkListTransporte.Items(k), txtMoeda.Text, txtPrecoTon.Text, dataInicio, dataFim, chkStandard.Checked)
DataGridView1.DataSource = dt
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
以这条线为例:
DataGridView1.DataSource = dt
并在所有循环结束后移动它。这不是唯一让你慢下来的事情,但我怀疑这是最大的。。。尝试在每次更改后重建网格
此外,在调用其他级别之前,可以重新构造循环以在每个级别进行过滤,这样可以节省大量工作。例如,假设您只有3个列表,每个列表中选择了10个项目中的5个。原始代码将运行整个if()
条件1000次,每次执行3个布尔比较,以便只生成125个结果。通过在降级到下一级之前对每一级进行筛选,可以最大限度地减少失败检查的数量。如果不预缓存选择,则相同的3个列表只需要310个布尔检查就可以生成相同的125个结果,如果执行以下操作,则需要30个布尔检查+一点额外内存:
Dim dt As New DataTable
dt.Columns.Add("Região", Type.GetType("System.String"))
dt.Columns.Add("Produto", Type.GetType("System.String"))
dt.Columns.Add("Cliente", Type.GetType("System.String"))
dt.Columns.Add("Tipo Atividade", Type.GetType("System.String"))
dt.Columns.Add("Acabamento", Type.GetType("System.String"))
dt.Columns.Add("Cores", Type.GetType("System.String"))
dt.Columns.Add("Gramagem", Type.GetType("System.String"))
dt.Columns.Add("Tipo Embalagem", Type.GetType("System.String"))
dt.Columns.Add("Formatos", Type.GetType("System.String"))
dt.Columns.Add("Contagem", Type.GetType("System.String"))
dt.Columns.Add("Transporte", Type.GetType("System.String"))
dt.Columns.Add("Moeda", Type.GetType("System.String"))
dt.Columns.Add("Preço", Type.GetType("System.String"))
dt.Columns.Add("Data Inicio", Type.GetType("System.String"))
dt.Columns.Add("Data Fim", Type.GetType("System.String"))
dt.Columns.Add("Standard", GetType(Boolean))
Dim dataInicio As String = DateTimeInicio.Value.ToString("dd-MM-yyyy")
Dim dataFim As String = DateTimeFim.Value.ToString("dd-MM-yyyy")
'Uncached:
For Each a In ChkListRegiao.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each b In ChkListProduto.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each c In ChkListTipoAtividade.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each d In ChkListAcabamento.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each f In ChkListCores.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each g In ChkListGramagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each h In ChkListTipoEmbalagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each i In ChkListFormatos.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each j In ChkListContagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
For Each k In ChkListTransporte.Items.Cast(Of ListItem)().Where(Function(li) li.Selected)
dt.Rows.Add(a, b, "", c, d, f, g, h, i, j, k, txtMoeda.Text, txtPrecoTon.Text, dataInicio, dataFim, chkStandard.Checked)
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
DataGridView1.DataSource = dt
'Cached:
Dim regiao = ChkListRegiao.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim produto = ChkListProduto.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim tipoatividade = ChkListTipoAtividade.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim acabamento = ChkListAcabamento.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim cores = ChkListCores.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim gramagem = ChkListGramagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim tipoembalagem = ChkListTipoEmbalagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim formatos = ChkListFormatos.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim contagem = ChkListContagem.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
Dim transporte = ChkListTransporte.Items.Cast(Of ListItem)().Where(Function(li) li.Selected).ToList()
For Each a In regiao
For Each b In produto
For Each c In tipoatividade
For Each d In acabamento
For Each f In cores
For Each g In gramagem
For Each h In tipoembalagem
For Each i In formatos
For Each j In contagem
For Each k In transporte
dt.Rows.Add(a, b, "", c, d, f, g, h, i, j, k, txtMoeda.Text, txtPrecoTon.Text, dataInicio, dataFim, chkStandard.Checked)
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
DataGridView1.DataSource = dt
您需要尝试这两种方法,以确定哪种方法对您的环境更快
但这似乎也错了。你真的想要从所有列表中选择所有可能的项目组合吗?我看不到图像,你能直接发布代码吗?发布代码而不是图像请不要发布代码图像!请以文本而不是图像的形式发布代码。
ChkListRegiao.Items.Count的值是多少?对于ChkListProduto.Items.Count
?等等?我会测试你告诉我的,是的,我现在需要所有可能的组合在最后一次之后它给我这个错误:System.InvalidCastException:'无法将'System.String'类型的对象强制转换为'xxxx.ListItem'。'我试图将dt.Columns.Add(“Região”,type.GetType(“System.String”))更改为dt.Columns.Add(“Regiãã”,GetType(ListItem)),但它仍然传递相同的错误