Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Коллекция из Listbox

34K
20 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Функция просто


Код:
private void button7_Click(object sender, EventArgs e)
        {

            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 вылазиет ошибка Что мол не тот поток :(

Что делать ?
Как лучше организовать перебор выделенных элементов?
297
20 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: shadowmaster63

Проблема в том что на строчке 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)
34K
20 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "listBox1" не из того потока, в котором он был создан. InvalidOperationException
Цитата:

foreach (string cats in listBox1.SelectedItems)


при этом изменении остается таже ошибка в том же месте

5
21 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Для обращения к элементам управления из другого потока нужно пользоваться методом Invoke.
В C# можно сделать такой хэлпер:
Код:
public static class ControlInvokeHelper {

        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);
            }
        }

    }
Использование в вашем контексте будет таким:
 
Код:
foreach (string cat in listBox1.SyncInvoke(lb => new ArrayList(lb.SelectedItems))) {

}
34K
21 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Спасибо щас попробую :)
Я обычно использовал вот такой способ
textBox3.Invoke(new MethodInvoker(delegate() { textBox3.AppendText("Загрузка завершена!!!\n"); button5.Enabled = true; }));
5
21 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: shadowmaster63
Спасибо щас попробую :)
Я обычно использовал вот такой способ
textBox3.Invoke(new MethodInvoker(delegate() { textBox3.AppendText("Загрузка завершена!!!\n"); button5.Enabled = true; }));


Всегда можно дополнить хэлпер:

 
Код:
public static void SyncInvoke<TControl>(this TControl control, Action<TControl> lambda) where TControl : Control {
            if (control.IsHandleCreated && control.InvokeRequired) {
                control.Invoke(lambda, control);
            } else {
                lambda(control);
            }
        }
В предложенной нотации код аналогичный вашему может выглядеть так:
 
Код:
textBox3.SyncInvoke(_ => {
    textBox3.AppendText("Загрузка завершена!!!" + Environment.NewLine);
    button5.Enabled = true;
});
Апд. Проверка IsHandleCreated обязательна, так как для контрола который создан в памяти но ещё не создан на экране InvokeRequired может вернуть true, а вот обращение к Invoke сгенерирует исключение. ;)
34K
21 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Еще глупый вопрос как из методов возвращать несколько значений ?
Или их надо сначала в один массив кидать а потом от туда извлекать ?
34K
21 декабря 2009 года
muturgan
96 / / 01.10.2009
Цитата: shadowmaster63
Еще глупый вопрос как из методов возвращать несколько значений ?
Или их надо сначала в один массив кидать а потом от туда извлекать ?


Два значения функция возвращать не может. Вы можете описать некую структуру (класс, вектор, лист), которая будет содержать возвращаемые значения.

34K
21 декабря 2009 года
shadowmaster63
93 / / 16.12.2009
Вообщем так и думал :) пошёл делать :)
297
21 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Можно использовать модификатор out или ref для параметров, через которые нужно вернуть значения.
1
21 декабря 2009 года
kot_
7.3K / / 20.01.2000
Цитата: muturgan
Два значения функция возвращать не может. Вы можете описать некую структуру (класс, вектор, лист), которая будет содержать возвращаемые значения.


можно так же использовать ссылки и указатели - например таким образом работают с параметрами большинство функций WinAPI

5
21 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: kot_
можно так же использовать ссылки и указатели - например таким образом работают с параметрами большинство функций WinAPI

Согласись, это очень нехорошая практика - модифицировать передаваемый в метод объект с целью простого возврата значений.

1
21 декабря 2009 года
kot_
7.3K / / 20.01.2000
Цитата: hardcase
Согласись, это очень нехорошая практика - модифицировать передаваемый в метод объект с целью простого возврата значений.


в мире вообще много зла и несправедливости. :)
но в данном случае это далеко не всегда "нехорошая" практика. ИМХО.

5
21 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: kot_
в мире вообще много зла и несправедливости. :)
но в данном случае это далеко не всегда "нехорошая" практика. ИМХО.


В языках с управляемым кодом, типа C# или Java, - это "по дефолту" нехорошая практика, так как гораздо безопаснее изготовить константный объект (а вот в Nemerle вообще есть кортежи) и отдать его назад. В компилируемых же в нативный код, таких как C++ или Object Pascal, для которых нет общей стандартной двоично совместимой системы типов (классов), такой способ возврата значений (заполнение полей структуры, переданной по ссылке) - фактически единственно возможный, но и пожалуй основной его плюс: исключается конфликт менеджеров памяти в DLL и EXE.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог