我的程序没有将项目添加到列表框中并且正在冻结

时间:2014-09-02 15:41:13

标签: sql vb.net

我试图向列表框中添加非常大量的项目以及我需要它是用于将所选项目添加到itextsharp表格报告我使用表格中的过滤器只是为了显示处理的销售人员客户或事件发生的日期(或产品报告问题)我的过滤系统如下我有4个类别,即4个列表框客户名称,客户代码(名为listBox1我还没有改变它)物种名称,以及我的过滤器放在searchBtn_Click事件下的错误类型我的过滤器和项目添加代码如下:

Private Sub searchBtn_Click(sender As Object, e As EventArgs) Handles searchBtn.Click

        For Each obj As contactObject In custList
            For Each item As speciesObject In speciesList
                'loadLists()

                If Trim(fromDate.Value) < Trim(obj.eventDate) Then
                    If Trim(toDate.Value) > Trim(obj.eventDate) Then
                        If Trim(fromDate.Value) < Trim(item.compDate) Then
                            If Trim(toDate.Value) > Trim(item.compDate) Then

                            End If



                            If Not customerListBox.Items.Contains(obj.customerName) Then
                                customerListBox.Items.Add(obj.customerName)
                            End If
                            If Not ListBox1.Items.Contains(obj.customer) Then
                                ListBox1.Items.Add(obj.customer)
                            End If
                            If Not speciesListBox.Items.Contains(item.name) Then
                                If ListBox1.Items.Contains(item.customerCode) Then
                                    speciesListBox.Items.Add(Trim(item.name).ToUpper)
                                End If
                            End If
                            If Not errorListBox.Items.Contains(obj.issue + "    -   " + obj.issueDescription) Then
                                errorListBox.Items.Add(Trim(obj.issue + "    -   " + obj.issueDescription).ToUpper)

                            End If

                        End If
                        End If
                    End If
 Next
        Next

        countErrors()

    End Sub

然后我有一个查询,它被设置为从数据库系统获取客户信息

Dim SqlText As String = "SELECT DISTINCT QEE.[EventID]  ,QEE.[EventDate]  ,QEE.[Employee]  ,QEE.[Communication]  ,QEE.[OtherCommunication]  ,QEE.[Issue]  ,QEE.[IssueDescription]  ,QEE.[IssueComments]  ,QEE.[Resolution]  ,QEE.[ResolutionComments]  ,QEE.[SalesOrderNumber]  ,QEE.[CustomerPO]  ,QEE.[SOStatus]  ,QEE.[Customer]  ,QEE.[CustomerName]  ,QEE.[SalesPersonName]  ,QEE.[IsResolved]  ,QEE.[IssueValue]  ,QEE.[DateAndTimeAdded]  ,DATEDIFF(day, SOR.ReqShipDate, QEE.[EventDate]) AS Elapsed, SOR.ReqShipDate FROM [QualityTracking].[dbo].[tblQualityEventEntry] QEE  INNER JOIN SysproCompanyC.dbo.SorMaster SOR  ON QEE.SalesOrderNumber = SOR.SalesOrder COLLATE Latin1_General_CI_AS   ORDER BY EventDate ASC, CustomerName ASC, SalesOrderNumber ASC;"

我无法在此处填写所有代码

如果您也可以提供一般性的帮助,我也是vb.net的新手,但是我尝试过的其他信息: * listbox.startUpdate / endUpdate *改变查询 *更改已排序的属性(现在它的设置为false) *问题发生在我选择全选然后点击搜索数据库持有近2Mil项目,我需要能够让它移动一旦我得到它工作停止冻结我将能够提高速度我只是不能完全出问题的地方我知道查询可能更好(如果你有任何建议请随意我正在学习) *但我也看到很多人在列表框中遇到这个问题,因为它有点像列出项目的方式 *我已经尝试过研究它并且人们已经说过使用了其他我不能做的事情,因为列表框已经提交了

1 个答案:

答案 0 :(得分:1)

假设Windows Forms

由于要添加的记录太多,您的程序可能没有响应,每次将项添加到ListBox.Items集合时,UI都会刷新。

您可以SuspendLayoutListbox添加到ResumeLayout,然后将ListBox.Items.AddRange()添加到其中。

Private Sub searchBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
    customerListBox.SuspendLayout();
    // Place your code to populate the ListBox control here...
    customerListBox.ResumeLayout();
End sub

这样可以避免在逐个添加项目时发生大量刷新,并允许应用程序减轻项目的添加,然后重新开始布局,以便刷新控件以向屏幕显示足够的信息。 / p>

您可以使用List.ToArray()方法和DataGridView

Private Sub searchBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim custList As List(Of ConstactObject) = loadYourCustomers();
    customerListBox.Items.AddRange(custList.ToArray());

    Dim speciesList As List(Of SpeciesObject) = loadYourSpecies();
    speciesListBox.Items.AddRange(speciesList.ToArray());
End sub

OR ELSE

我建议使用DataSource并将其Form属性设置为对象列表。

因此,为了获得正确的数据,您必须:

  1. BindingSource
  2. 上删除两个 DataGridView
  3. DataGridView 重命名为有意义的名称(例如custListDataGridViewspeciesListDataGridview
  4. Form
  5. 上删除两个{{3}}
  6. BindingSource 重命名为有意义的名称(例如custListBindingSourcespeciesListBindingSource
  7. 在设计器中,将 DataGridView.DataSource 属性设置为各自的 BindingSource (例如custListDataGridview.DataSource = custListBindingsourcespeciesListDataGridView.DataSource = speciesListBindingSource
  8. 在支持代码中,即在searchBtn.Click事件中,您可以设置两个绑定来源 DataSource 属性

    Private Sub searchBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim custList As IList(Of ContactObject) =  loadYourContactObjects();
        custListBindingSource.DataSource = custList;
    
        Dim speciesList As IList(Of SpeciesObject) = loadYourSpeciesObject();           
        speciesListBindingSource.DataSource = speciesList;
    End Sub
    
  9. 您的信息数据应自动列出,无需手动添加每条记录。