如何以線程安全的方式遍歷C#WinForms ComboBox.Items集合(請參閱下面的示例代碼)?使用集合我可以使用控制鎖定,但我不控制comboBox.Items集合,因爲它通過其數據綁定源進行更新(如果我想保持此方法可重用,則無法與任何特定的數據綁定源進行交互在這個代碼中)。有一個comboBox.Items.CopyTo方法,但我需要先創建一個數組,計數可能會在創建數組和執行復制之間改變?以線程安全的方式對CombBox.Items進行迭代
感謝您的任何建議。
private void SetComboBoxWidth(ComboBox comboBox, bool setDropDownWidth)
{
int maxWidth = 0;
using (Graphics graphics = comboBox.CreateGraphics())
{
foreach (object item in comboBox.Items)
{
int curWidth = TextRenderer.MeasureText(graphics, item.ToString(), comboBox.Font).Width;
if (curWidth > maxWidth)
{
maxWidth = curWidth;
}
}
}
maxWidth += SystemInformation.VerticalScrollBarWidth;
if (setDropDownWidth)
{
comboBox.DropDownWidth = maxWidth;
}
else
{
comboBox.Width = maxWidth;
}
}
編輯:上述 的代碼拋出:{System.InvalidOperationException}集合已修改;枚舉操作可能不會執行。
組合框被設置了:
myComboBox.ComboBox.DataSource = new BindingList<IMyInterface>();
而調用鏈是:MyForm.OnLoad-> MyForm.Setup-> MyForm.SetComboBoxWidth
編輯2: 更改示例代碼不在循環期間可以改變ComboBox(以前的版本可能會調整每次迭代的寬度)。
WinForms是單線程的。如果你不直接在另一個線程中做任何事情,它總是線程安全的。這意味着,即使數據源更新是在另一個線程中進行的,更新也會在正確的UI線程中分派。當然,如果你改變foreach循環內comboBox.Items枚舉會失敗,但這是真實的任何列舉...... –
@Adriano 上面的示例代碼拋出: 集合已修改;枚舉操作可能不會執行。 {System.InvalidOperationException} – FPike
拋出什麼? - 編輯:打字太慢 – toATwork