Получить RETURN из метода Invoke

Я пытаюсь прочитать значение из элемента списка, который находится в другом потоке.

Я попытался создать новый метод для запуска команды вызова, мне удалось отправить команду в список, например добавить, с помощью метода вызова, но я не могу получить ответ, я не могу получить значение элемента, я пробовал несколько способов, как только я меняю его с пустоты на строку, все начинает становиться волосатым...

  thread t1 = new thread(thethread)
    t1.start()

    public void thethread()
    {
    string text = readListBoxSelected(listBox1) + " lala" ;
    }



    public static string readListBoxSelected(ListBox listbox)
    {
        if (listbox.InvokeRequired)
        {
            return (string)listbox.Invoke(
              new Func<String>(() => readListBoxSelected(listbox))
            );
        }
        else
        {

            string varText = listbox.SelectedValue.ToString();
            return varText;
        }
        }

Выше приведен пример того, что я пытаюсь сделать.

Вот ошибка:

Исключение System.NullReferenceException не было обработано кодом пользователя
Message=Ссылка на объект не указывает на экземпляр объекта.
Source=** StackTrace: at **.Form1.readListBoxSelected(ListBox listbox) в e:\documents and settings\scott\my documents\visual studio 2010\Projects***< /strong>**\Form1.cs:строка 133 в ***.Form1.‹>c_ DisplayClass5.b_3() в e:\documents and settings\scott\my document\visual studio 2010\Projects***** *\Form1.cs:строка 127 Внутреннее исключение:

Я предполагаю, что неправильно то, что он говорит: «Ссылка на объект не установлена ​​​​на экземпляр объекта»....... Все мои переменные, кажется, объявлены справедливыми, насколько я знаю, как я могу это исправить ??

У меня такое чувство, что я делаю все неправильно.... 0_o Заранее спасибо, Скотт


person scott    schedule 12.06.2011    source источник


Ответы (3)


Попробуй это

public static string readListBoxSelected(ListBox listbox)
    {
        if (listbox.InvokeRequired)
        {
            return (string)listbox.Invoke(
              new Func<String>(() => readListBoxSelected(listbox))
            );
        }
        else
        {
if(istbox.SelectedValue != null)

            return  listbox.SelectedValue.ToString();
else
return String.Empty
        }
        }
person DeveloperX    schedule 12.06.2011
comment
хм, спасибо за исправление, я не могу понять, почему он возвращает ноль, я имею в виду, что элемент списка выбирается с помощью кода, и он возвращает ноль, и если я выбираю его с помощью мыши в приложении, он все еще содержит ноль, но список полон текст..... - person scott; 13.06.2011
comment
теперь работает, спасибо вам обоим, ребята, проблема заключалась в том, что я напрямую выбирал элемент, мне также нужно использовать вызов, чтобы выбрать его .... - person scott; 13.06.2011
comment
Вы имеете в виду, что хотите выбрать элемент программно, а не по щелчку пользователя? - person DeveloperX; 13.06.2011

Код выглядит нормально, проблема связана с SelectedValue, является ли оно null. ???

person crypted    schedule 12.06.2011
comment
я согласен, может быть, выбранное значение равно нулю, и вы пытаетесь преобразовать его в строку - person DeveloperX; 12.06.2011
comment
хм, выбранное значение определенно не равно нулю, потому что я выбираю его до того, как нажму кнопку «Пуск», чтобы запустить код. - person scott; 13.06.2011
comment
Хм, я вставил туда messagebox.show, чтобы посмотреть, что происходит, кажется, он всегда возвращает ноль... но элемент списка выбран...] - person scott; 13.06.2011
comment
список выбирается так: int i = 1; while(i ‹= listBox1.Items.Count) { listBox1.SelectedItem = i; - person scott; 13.06.2011
comment
хорошо, я думаю, я разобрался, мне нужно вызвать список, чтобы на самом деле также выбрать элемент ... из другого потока .... было намного проще, когда я мог просто пойти ..... CheckForIllegalCrossThreadCalls = false; ржу не могу - person scott; 13.06.2011
comment
хорошо, он возвращал NULL просто потому, что listbox.SelectedValue на самом деле не является вызовом im после чтения выбранного значения (вы могли бы подумать, что это так), если я изменю его на listbox1.text, все работает нормально... - person scott; 13.06.2011

Спасибо, парни,

Вы были правы, проблема заключалась в том, что он возвращал нулевое значение. Я был настолько уверен, что правильно выбрал элемент, я никогда не думал, что это может быть проблемой.

Оказывается, проблема была в двух вещах:

1) При выборе элемента я использовал listbox.Selecteditem = 1 , теперь, если я использую listbox.setSelected(1,true), все хорошо :)

и

2) То, как я получал текст элементов, было неправильным, listbox.SelectedValue - это ничто, оно не делает то, что мы все себе представляем... вызов, который мне нужен, был listbox.Text ....... ..

public static string readListBoxSelected(ListBox listbox)
{
    if (listbox.InvokeRequired)
    {
        return (string)listbox.Invoke(
          new Func<String>(() => readListBoxSelected(listbox))
        );
    }
    else if(listbox.Text != null)
    {
        return  listbox.Text.ToString();
    } 
    else
    return String.Empty;
    }


public void selectListBoxItem(ListBox listbox, int num)
{
    Invoke(new MethodInvoker(delegate { listbox.SetSelected(num,true); }));
}

Я должен сказать, что это самая раздражающая вещь, которую я когда-либо делал... Все требует, чтобы я написал для нее метод делегата/вызова... Все... не будет ли что-то столь распространенное поддерживаться .net на лету....

Кажется талией времени, чтобы написать отдельных делегатов для ВСЕХ...

Спасибо, ребята, теперь все работает, вчера я не мог предвидеть, что доберусь до этого момента, Общая проблема заключалась в неправильных вызовах, вызов был в порядке :)

Скотт

РЕДАКТИРОВАТЬ:

хорошо, он возвращал NULL просто потому, что listbox.SelectedValue на самом деле не является вызовом im после чтения selectedvalue (вы могли бы подумать, что это так), если я изменю его на listbox1.text все работает нормально.... довольно глупо это. чистый объектно-ориентированный материал, если я так говорю....

Я должен сказать, какая шутка... это любезно разрушило мою веру в объектно-ориентированное программирование. Я понимаю, что это не дискуссия, но, честно говоря, вызов SelectedValue.toString() должен делать то, что мы все думаем, что он будет делать.... нет, нам нужно использовать .Text, чтобы получить то, что нам нужно 0_o.........

person scott    schedule 13.06.2011