2016-03-14 96 views
2

所以,我有兩個選擇:ComboBox.Item.AddRange(string [])VS. ComboBox.DataSource =字符串[]

aComboBox.Item.AddRange(stringArray); 
aComboBox.SelectedItem = stringFromStringArray; 

aComboBox.DataSource = stringArray; 
aComboBox.SelectedItem = stringFromStringArray; 

現在,第一個是waaaaay慢,當涉及到初始化(約5-6倍)。它確實設置了選定的項目,但仍然非常慢,所以我決定和第二個一起去。

但是,如果我使用第二個,aComboBox內的Items數組在執行第二個命令時尚未設置,因此所選項目是索引1處的項目,而不是指定的項目。

問題是,如何使用第一個功能得到第二個的性能?

編輯:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace ComboBoxTest 
{ 
class MainWindow : Form 
{ 
    string[] list = new string[1548]; 
    TableLayoutPanel panel = new TableLayoutPanel(); 

    public MainWindow() : base() 
    { 
     Height = 2000; 
     Width = 1000; 

     Random rand = new Random(); 

     for (int i = 0; i < 1547; i++) 
     { 
      list[i] = rand.Next().ToString(); 
     } 

     list[1547] = 5.ToString(); 

     Button button = new Button(); 
     button.Text = "Press me"; 
     button.Click += Button_Click; 

     panel.Controls.Add(button, 0, 0); 

     panel.Height = 2000; 
     panel.Width = 1000; 

     Controls.Add(panel); 

     Show(); 
    } 

    private void Button_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 36; i++) 
     { 
      ComboBox box = new ComboBox(); 
      box.DataSource = list; //box.Items.AddRange(list); 
      box.SelectedItem = 5.ToString(); 

      panel.Controls.Add(box, 0, i+1); 
     } 
    } 
} 
} 

我這個程序的複製問題。如果將其更改爲addRange(),則需要更多時間,但它會設置該項目。

嘗試向SelectedItem添加斷點,然後查看ComboBox。 如果您設置一個,另一個將爲空(DataSourceItems)。 ComboBox似乎查看Items來檢查該字符串是否存在於列表中,這就是爲什麼它使用DataSource方法失敗。

獎勵問題:爲什麼所有的ComboBoxes作爲一個工作(嘗試更改值)?

+0

無法複製第二種情況。請測試一個獨立的項目併發布簡單的複製代碼。 –

+0

只需搜索項目,直到您獲得指定的項目設置選定的索引 – Cjen1

+0

我使用10,100,1000,10000和100000項目進行了測試。它正常工作。它首先設置'DataSource',然後它設置選定的項目。可能你的'stringFromStringArray'在數組中不存在。 –

回答

2

的問題是,我該如何獲得第二個的性能 功能第一個?

如果您希望它能正常工作,可以在將面板添加到面板後將行box.SelectedItem = 5.ToString();移動到該行。

當您爲組合框使用DataSource時,僅當您的窗體上存在組合框時,設置SelectedItem才起作用。

我不確定關於性能,但確定功能。

獎勵問題:爲什麼所有的ComboBox工作爲一個(嘗試更改 的值)?

因爲它們綁定到相同DataSource。事實上,他們正在使用一個單一的BindingManagerBase

您可以爲他們使用不同的BindingSource。你也可以將它們綁定到list.ToList()

+0

我正在使用一個循環將36個複雜控件添加到TabLayoutPanel中,該TabLayoutPanel在選項卡中,該選項卡也位於窗口中的選項卡中。如果我必須將每個ComboBox的引用都保存到窗口(窗體),那麼代碼會變得非常混亂和難看。有沒有其他的方式來做到這一點,讓它覺得它存在之前就存在?我真的不想過度複雜的代碼,另一種方式就是這麼慢...... – Karlovsky120

+0

我沒有說你應該把它們添加到表單中,你應該在添加到面板後設置'SelectedItem'。將它們添加到面板時,它們存在於表單上。但關於性能,我認爲最好讓你以前的問題得到答案:) –

+0

是的,出於某種原因在我的主程序中不起作用。問題是我在創建它之後添加了所有內容。那麼ComboBox繼續使用的面板?我在添加ComboBox後,將其添加到包含處理ComboBox的方法的方法中。所以comboBox不存在,直到我在層次結構中的幾個方法。而這個面板,它仍然沒有,我必須添加到一個標籤,以及當我完成創建。然後,該標籤到另一個。等等,等等。有任何想法嗎? – Karlovsky120

0

使用德DataSource的方法,並使用查找字符串的方法來找到你想要的所選文本的索引:

string[] arrString = {"hello", "how r u", "fine" }; 
comboBox1.DataSource = arrString; 
comboBox1.SelectedIndex=comboBox1.FindString("fine"); 
MessageBox.Show(comboBox1.SelectedIndex.ToString()); 
+0

由於'DataSource'和'Item'之間的關係而不起作用。索引也會失敗。 – Karlovsky120

+0

你是什麼意思的關係?使用FindStringExact – Amir