For循环遍历Windows窗体中的所有清单框

时间:2018-11-28 18:20:28

标签: vb.net checkedlistbox

我已经解决了我的问题,但是处理时间太长。 我想以某种方式获得帮助,可以遍历我窗体中的所有10个清单列表框,以便每个表填充datagridview的一列。 这是我的代码

第一段代码:

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

1 个答案:

答案 0 :(得分:0)

上一行:

DataGridView1.DataSource = dt

在所有For循环结束后 并将其移动。这不是唯一会减慢您速度的事情,但我怀疑这是最大的事情...在每次更改后尝试重新构建网格。

另外,您可以重构循环以在调用其他级别之前在每个级别进行过滤,然后以这种方式节省大量工作。例如,假设您只有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

您将希望同时尝试两者,以查看哪种方法对您的环境更快。

但是,这似乎是错误的。您是否真的希望从所有列表中选择所有可能的项目组合?