Возьмите эту строку:
DataGridView1.DataSource = dt
И переместите ее после того, как завершится все циклы For
.Это не единственное, что замедляет вас, но я подозреваю, что это самая большая ... попытка перестроить сетку после каждого изменения.
Кроме того, вы можете реструктурировать циклы для фильтрации на каждом уровне перед вызовом на другие уровни и таким образом сэкономите немало работы.Например, скажем, у вас есть только 3 списка, в каждом из которых выбрано 5 из 10 пунктов.Исходный код будет выполнять все условия 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
You 'Я хочу попробовать оба варианта, чтобы увидеть, что быстрее для вашей среды.
Но даже это кажется неправильным.Вы действительно хотите, чтобы каждая возможная комбинация предметов была выбрана из всех списков?