none
VB2008 Combobox 控制項陣列的問題 RRS feed

  • 問題

  • 我在一個form裡面建立了2組8個的combox ,然後我在裡面加入了255個item 結果開起來很慢,後來我把i加入Item拿掉,
    還是很慢,請問一下這是什麼原因呢?

    2009年8月4日 上午 07:22

解答

所有回覆

  • 您目前程式碼是怎麼寫的,加入與拿掉Item的部份


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    2009年8月4日 上午 07:41
    版主
  •  Private Sub CreateWaveSelectCombox()
            Dim textname As String
            Dim counter As Integer = 1
            Dim i As Integer
            Dim j As Integer
            counter = 1
            For i = 1 To 8
                textname = "WaveSelectCombox" + CStr(counter)
                Dim WaveSelectCombox As New ComboBox
                WaveSelectCombox.Name = textname


                WaveSelectCombox.BackColor = Color.BlanchedAlmond
                WaveSelectCombox.Location = (New Point(60, 90 + i * 27))
                WaveSelectCombox.Size = New Size(150, 20)
                counter += 1

                Me.Controls.Add(WaveSelectCombox)

                'AddHandler WavFileSize.TextChanged, AddressOf WavFileSize_TextChanged
            Next

            '  i = 1
            For j = 1 To 8
                For i = 1 To 255

                    CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(WavShortPath(i))
                Next
            Next
        End Sub

        Private Sub CreateRepeatCombox()
            Dim textname As String
            Dim counter As Integer = 1
            Dim i As Integer
            Dim j As Integer
            counter = 1
            For i = 1 To 8
                textname = "RepeatCombox" + CStr(counter)
                Dim RepeatCombox As New ComboBox
                RepeatCombox.Name = textname


                RepeatCombox.BackColor = Color.BlanchedAlmond
                RepeatCombox.Location = (New Point(240, 90 + i * 27))
                RepeatCombox.Size = New Size(40, 20)
                counter += 1

                Me.Controls.Add(RepeatCombox)

                'AddHandler WavFileSize.TextChanged, AddressOf WavFileSize_TextChanged
            Next
            For j = 1 To 8

                For i = 1 To 255
                    CType(Me.Controls("RepeatCombox" & j), ComboBox).Items.Add(CStr(i))
                Next
                CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox).SelectedIndex = 0
            Next

        End Sub

    2009年8月4日 上午 07:42
  • 你的 CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(WavShortPath(i)) 裡面的 WavShortPath(i) 是不是有做什麼處理

    我把這部份改成 CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(i.ToString) 做測試,速度很快


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    2009年8月4日 上午 07:47
    版主

  • 宣告在mudule 內 dim WavShortPath(256) as string
    因為要給別的form一起用
    然後我再另一個f orm 裡面  是有用 ini 讀取

     Private Sub Readini()
            Dim area0 As String = "WavShortpath"
            Dim area1 As String = "Wavpath"

            Dim area2 As String = "WavTime"
            Dim area3 As String = "WavFileSize"
            Dim buffer1 As String
            Dim buffer2 As String
            Dim buffer3 As String
            Dim buffer0 As String
            Dim i As Integer
            Dim ret As Long

            buffer0 = Space(256)
            buffer1 = Space(256)
            buffer2 = Space(256)
            buffer3 = Space(256)

                 For i = 1 To 255
                ret = GetPrivateProfileString(area1, "Wavpath" & CStr(i), "", buffer1, 256, "C:\aa2.ini")
                WavPath(i) = buffer1

                ret = GetPrivateProfileString(area2, "WavTime" & CStr(i), "", buffer2, 256, "C:\aa2.ini")
                WavTime(i) = buffer2

                ret = GetPrivateProfileString(area3, "WavFileSize" & CStr(i), "", buffer3, 256, "C:\aa2.ini")
                WavFileSize(i) = buffer3

                ret = GetPrivateProfileString(area0, "WavShortpath" & CStr(i), "", buffer0, 256, "C:\aa2.ini")
                WavShortPath(i) = buffer0
            Next

        End Sub

    2009年8月4日 上午 07:53
  • 冷大哥是說我在宣告動態陣列的時候寫錯了嗎?
    2009年8月4日 上午 08:09
  • 小歐歌,我剛剛試你的方法結果是一樣我大概要6-7秒才會出現,冷大哥說的去看那個 Designed.vb我有去看,裡面跟我宣告的差不多阿
    2009年8月4日 上午 08:43
  • 應該是讀ini檔,太耗時了...
    2009年8月4日 上午 08:51
  • 我在form1 load 裡面就load完了
    然後我用menu下拉選擇才出現第二個畫面
    所以應該不是Joe 大哥說的這個情形吧

    2009年8月4日 上午 08:53
  • 您Form Load做了哪些事?menu下拉又做了什麼?7秒是跑哪些程式?您可以下中斷點,檢查是慢在哪個迴圈...
    2009年8月4日 上午 08:58
  • 補充一下:小弟menu下拉功能表只是show.form2而已

    Joe大哥如你所說的,小弟剛剛試了一下,是曼在這哩,我把
    拿掉就很快了
      在form1裡面讀取是需要一些時間沒錯
    在form2的問題 是曼在這裡,  可是要等6秒也太慢了吧!
     For j = 1 To 8

                For i = 1 To 255
                    CType(Me.Controls("RepeatCombox" & j), ComboBox).Items.Add(CStr(i))
                Next
                CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox).SelectedIndex = 0
            Next

           For j = 1 To 8
                For i = 1 To 255

                    CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(WavShortPath(i))
                Next
            Next
        End Sub



     

    2009年8月4日 上午 09:02
  • 你把這個拿掉 WavShortPath(i) 換成 i.ToString 也一樣要六秒嗎?


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    2009年8月4日 上午 09:08
    版主
  • 對阿!我想到一件事情了,會不會是跟這個有關係,我還不會鎖定當我跳到第二個form裡面不能拉動第一個form
    ,現在的畫面就是 可以隨意移動兩個畫面,會不會是因為第一個畫面也在執行,然後第二個就比較慢!

    2009年8月4日 上午 09:12

  •  For j = 1 To 8

                For i = 1 To 255
                    CType(Me.Controls("RepeatCombox" & j), ComboBox).Items.Add(CStr(i))
                Next
                CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox).SelectedIndex = 0
            Next

           For j = 1 To 8
                For i = 1 To 255

                    CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(WavShortPath(i))
                Next
            Next
        End Sub
     


    1.未加入BeginUpdate與EndUpdate
    ComboBox.BeginUpdate 方法

    在一次加入一個項目至 ComboBox 時維持效能。


    2.For迴圈內不必要的轉型過多
     CType(Me.Controls("RepeatCombox" & j), ComboBox) <=可提到外部For

    提到外部後連下面的轉型也可以省略共用了
    CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox)

    3.me.Controls是要搜尋的,使用太頻繁會降低速度

    http://www.dotblogs.com.tw/larrynung/
    2009年8月4日 上午 09:15
  • 不是,是先關閉控制項立即更新功能,可減少自動更新的耗時。

    換個關鍵字 SuspendLayout:
    http://social.msdn.microsoft.com/Search/zh-TW/?query=SuspendLayout&refinement=112&rn=Visual%20Basic%20%E8%AB%96%E5%A3%87&rq=meta%3ASearch.MSForums.ForumID(78e6145b-ef29-4a75-a0ff-d4d3828dcd1a)&ac=8

    讀 INI 檔雖然會慢,但是慢的有限,不致於到 6 秒,現在電腦太快了,這種次數大概最多耗 1 秒不到。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年8月4日 上午 09:29
  • 另外清單我比較建議放在資料庫直接加進去,真的不願意用資料庫的話,先全部加入 List 集合再指給 ComboBox.DataSource 會比較快,因為 List 再指給 ComboBox 不會觸動 ComboBox 任何事件,也可以節省時間。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年8月4日 上午 09:33
  •   For j = 1 To 8

                CType(Me.Controls("WaveSelectCombox" & j), ComboBox).BeginUpdate()
                CType(Me.Controls("RepeatCombox" & j), ComboBox).BeginUpdate()

                For i = 1 To 255
                    CType(Me.Controls("WaveSelectCombox" & j), ComboBox).Items.Add(i.ToString)
                    CType(Me.Controls("RepeatCombox" & j), ComboBox).Items.Add(i.ToString)
                               Next
                CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox).SelectedIndex = 0


                CType(Me.Controls("WaveSelectCombox" & j), ComboBox).EndUpdate()
                CType(Me.Controls("RepeatCombox" & j), ComboBox).EndUpdate()

            Next

    大哥是這樣寫嗎?我這樣好像有比較快大約是3秒會出現

    2009年8月4日 上午 09:45
  • Hi, 

    還是太多轉型,也太多Me.Controls 

    我指的是像下面這樣

    thx

      For j = 1 To 8
    
                Dim cbxWave as comboBox = DirectCast(Me.Controls("WaveSelectCombox" & j), ComboBox)
                Dim cbxRepeat as comboBox = DirectCast(Me.Controls("RepeatCombox" & j), ComboBox)
    	    cbxWave.BeginUpdate()
    	    cbxRepeat.BeginUpdate()
                For i = 1 To 255
    	        Dim num as string=i.ToString
                    cbxWave.Items.Add(num)
                    cbxRepeat.Items.Add(num)
                Next
                cbxRepeat .SelectedIndex = 0
    
    
                cbxWave.EndUpdate()
                cbxRepeat .EndUpdate()
    
            Next



    http://www.dotblogs.com.tw/larrynung/
    2009年8月4日 上午 10:07
  • 小弟了解了ㄏㄏㄏ!謝謝!

    2009年8月4日 上午 10:09
  • 改:

    For j = 1 To 8
    	Dim nowWaveComboBox As ComboBox = CType(Me.Controls("WaveSelectCombox" & j), ComboBox)
    	Dim nowRepeatComboBox As ComboBox = CType(Me.Controls("RepeatCombox" & j), ComboBox)
    
    	Dim nowWaveList As New List(Of Integer)
    	Dim nowRepeatList As New List(Of Integer)
    
    	For i = 1 To 255
    		nowWaveList.Add(i)
    		nowRepeatList.Add(i)
    	Next
    	nowWaveComboBox.DataSource = nowWaveList
    	nowRepeatComboBox.DataSource = nowRepeatList
    	
    	nowRepeatComboBox.SelectedIndex = 0
    Next

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年8月4日 上午 10:14
  • 我剛剛也是類似這樣打 ,冷大哥的作法好像快那麼一點 跟蹂躪大哥的作法比較的話我的form還是在3.4秒出現
    2009年8月4日 上午 10:17
  • 小弟從控制項開了兩個list
    然後把它隱藏
    這樣好像比較快       
    For i = 1 To 255
                ListBox1.Items.Add(WavShortPath(i))
            Next
            For i = 1 To 8
                ListBox2.Items.Add(CStr(i))
            Next

            For j = 1 To 8
                CType(Me.Controls("WaveSelectCombox" & j), ComboBox).DataSource = ListBox1.Items
                CType(Me.Controls("RepeatCombox" & j), ComboBox).DataSource = ListBox2.Items
            Next
            '======================================

    2009年8月4日 上午 10:25
  • Hi,

    還要那摸久?
    心冷大提的SuspendLayout加上了嗎?!

    另外除了剛修改的部份外
    我往上看了一下你的Code
    For i = 1 To 8
                textname = "RepeatCombox" + CStr(counter)
                Dim RepeatCombox As New ComboBox
                RepeatCombox.Name = textname
    
    
                RepeatCombox.BackColor = Color.BlanchedAlmond
                RepeatCombox.Location = (New Point(240, 90 + i * 27))
                RepeatCombox.Size = New Size(40, 20)
                counter += 1
    
                Me.Controls.Add(RepeatCombox)
    
                'AddHandler WavFileSize.TextChanged, AddressOf WavFileSize_TextChanged
            Next
            For j = 1 To 8
    
                For i = 1 To 255
                    CType(Me.Controls("RepeatCombox" & j), ComboBox).Items.Add(CStr(i))
                Next
                CType(Me.Controls("RepeatCombox" & CStr(j)), ComboBox).SelectedIndex = 0
            Next

    我覺得不該先把8個ComboBox都加上後才再跑8*255次去設Item
    應該把加Item的動作移至上面的迴圈內
    且加在Controls.Add前為佳
    移進去除了可以少跑8次迴圈
    也可以不用用Me.Controls去找尋控制項

    counter 區域變數看起來也是多餘的

    請結合上述與之前所有提到的修改再測測看

    http://www.dotblogs.com.tw/larrynung/
    2009年8月4日 上午 10:33
  • 感謝蹂躪大哥指導
    2009年8月4日 上午 10:47
  • 請問一下是這樣寫嗎? 
    Private Sub CreateWaveSelectCombox()
            Dim textname As String
            Dim counter As Integer = 1
            Dim i As Integer


            For i = 1 To 255
                If Val(WavShortPath(i)) <> 0 Then
                    ListBox2.Items.Add(WavShortPath(i))
                End If
            Next

           
            counter = 1
            For i = 1 To 8
                textname = "WaveSelectCombox" + CStr(i)
                Dim WaveSelectCombox As New ComboBox
                WaveSelectCombox.Name = textname

                WaveSelectCombox.SuspendLayout()

                WaveSelectCombox.BackColor = Color.BlanchedAlmond
                WaveSelectCombox.Location = (New Point(60, 90 + i * 27))
                WaveSelectCombox.Size = New Size(150, 20)

                WaveSelectCombox.TabIndex = 0

                WaveSelectCombox.DataSource = ListBox2.Items
                Me.Controls.Add(WaveSelectCombox)

                AddHandler WaveSelectCombox.SelectedIndexChanged, AddressOf WaveSelectCombox_SelectedIndexChanged

                WaveSelectCombox.ResumeLayout(False)
                WaveSelectCombox.PerformLayout()

            Next

          
            '  i = 1

        End Sub

    Private Sub CreateRepeatCombox()
            Dim textname As String
            Dim counter As Integer = 1
            Dim i As Integer


            For i = 1 To 8
                ListBox1.Items.Add(CStr(i))
            Next

            counter = 1
            For i = 1 To 8
                textname = "RepeatCombox" + CStr(i)
                Dim RepeatCombox As New ComboBox
                RepeatCombox.Name = textname

                RepeatCombox.SuspendLayout()
               
                RepeatCombox.BackColor = Color.BlanchedAlmond
                RepeatCombox.Location = (New Point(240, 90 + i * 27))
                RepeatCombox.Size = New Size(40, 20)
                RepeatCombox.TabIndex = 0
                RepeatCombox.DataSource = ListBox1.Items
                Me.Controls.Add(RepeatCombox)

                RepeatCombox.ResumeLayout(False)
                RepeatCombox.PerformLayout()

                AddHandler RepeatCombox.SelectedIndexChanged, AddressOf RepeatCombox_SelectedIndexChanged
            Next

    end sub

    2009年8月4日 上午 11:05
  • Hi,

    不是歐
    請先聽心冷大建議參考.Designer.Vb檔吧
    錯很大~

    另外counter 還是沒拿乾淨

    WavShortPath(i).Length=0 比 Val(WavShortPath(i)) <> 0 來得快

    http://www.dotblogs.com.tw/larrynung/
    2009年8月4日 上午 11:17
  • OK謝謝大哥我在去研究一下,先吃飯了ㄏㄏㄏ謝謝大家指導

    2009年8月4日 上午 11:19