Коллекция из Listbox
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
string[] category = parse_category();
foreach (string cats in listBox1.SelectedIndices)
{
prew_mat_link(cats, false);
}
}
Проблема в том что на строчке foreach (string cats [COLOR="Red"]in[/COLOR] listBox1.SelectedIndices)
в операторе in вылазиет ошибка Что мол не тот поток :(
Что делать ?
Как лучше организовать перебор выделенных элементов?
Проблема в том что на строчке foreach (string cats [COLOR="Red"]in[/COLOR] listBox1.SelectedIndices)
в операторе in вылазиет ошибка Что мол не тот поток :(
Что делать ?
Как лучше организовать перебор выделенных элементов?
Вообще-то должно появиться исключение:
System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.
Запомните на будущее: всегда приводите точное описание ошибки. Иначе никто в вашем коде копаться не будет.
SelectedIndices - это коллекция целочисленных индексов. А вы пытаетесь получить оттуда строку.
В вашем случае достаточно такого изменения:
foreach (string cats in listBox1.SelectedItems)
при этом изменении остается таже ошибка в том же месте
В C# можно сделать такой хэлпер:
public static TResult SyncInvoke<TControl, TResult>(this TControl control, Func<TControl, TResult> lambda) where TControl : Control {
if (control.IsHandleCreated && control.InvokeRequired) {
return (TResult)control.Invoke(lambda, control);
} else {
return lambda(control);
}
}
}
}
Я обычно использовал вот такой способ
textBox3.Invoke(new MethodInvoker(delegate() { textBox3.AppendText("Загрузка завершена!!!\n"); button5.Enabled = true; }));
Я обычно использовал вот такой способ
textBox3.Invoke(new MethodInvoker(delegate() { textBox3.AppendText("Загрузка завершена!!!\n"); button5.Enabled = true; }));
Всегда можно дополнить хэлпер:
if (control.IsHandleCreated && control.InvokeRequired) {
control.Invoke(lambda, control);
} else {
lambda(control);
}
}
textBox3.AppendText("Загрузка завершена!!!" + Environment.NewLine);
button5.Enabled = true;
});
Или их надо сначала в один массив кидать а потом от туда извлекать ?
Или их надо сначала в один массив кидать а потом от туда извлекать ?
Два значения функция возвращать не может. Вы можете описать некую структуру (класс, вектор, лист), которая будет содержать возвращаемые значения.
можно так же использовать ссылки и указатели - например таким образом работают с параметрами большинство функций WinAPI
Согласись, это очень нехорошая практика - модифицировать передаваемый в метод объект с целью простого возврата значений.
в мире вообще много зла и несправедливости. :)
но в данном случае это далеко не всегда "нехорошая" практика. ИМХО.
но в данном случае это далеко не всегда "нехорошая" практика. ИМХО.
В языках с управляемым кодом, типа C# или Java, - это "по дефолту" нехорошая практика, так как гораздо безопаснее изготовить константный объект (а вот в Nemerle вообще есть кортежи) и отдать его назад. В компилируемых же в нативный код, таких как C++ или Object Pascal, для которых нет общей стандартной двоично совместимой системы типов (классов), такой способ возврата значений (заполнение полей структуры, переданной по ссылке) - фактически единственно возможный, но и пожалуй основной его плюс: исключается конфликт менеджеров памяти в DLL и EXE.