我已经解决了我的问题,但是处理时间太长。 我想以某种方式获得帮助,可以遍历我窗体中的所有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
答案 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
您将希望同时尝试两者,以查看哪种方法对您的环境更快。
但是,这似乎是错误的。您是否真的希望从所有列表中选择所有可能的项目组合?