从Invoked方法获取RETURN

时间:2011-06-12 05:03:02

标签: c# multithreading listbox invoke

我正在尝试从另一个线程上的列表框项中读取值。

我试图创建一个新的方法来运行invoke命令,我可以设法将命令发送到列表框,就像通过invoke方法添加但我似乎无法获得响应,我似乎无法得到的值item,我尝试了几种方法,一旦我将它从一个空格改为一个字符串,事情开始变得毛茸茸......

  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 =对象引用未设置为   对象的实例。
  来源= * * StackTrace:          在 * * .Form1.readListBoxSelected(ListBox列表框)中的e:\ documents和   settings \ scott \ my documents \ visual   工作室   2010 \项目** * * * \ Form1.cs中:线   133          在 *** .Form1。&lt;&gt; c_ DisplayClass5.b _3()   在e:\ documents和settings \ scott \ my中   文件\视觉工作室   2010 \项目** * * ** \ Form1.cs中:线   127 InnerException:

我想错的正是它所说的“对象引用没有设置为对象的实例”.......所有我的变量似乎被宣布为公平,因为我知道,我该如何纠正此??

我感觉我错误地对待整个事情...... 0_o 提前致谢, 斯科特

3 个答案:

答案 0 :(得分: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
        }
        }

答案 1 :(得分:1)

代码看起来很好,问题出现在 SelectedValue 上,是 null 。 ???

答案 2 :(得分:0)

谢谢你们,

你在哪里正确,问题是它返回一个空值.. 我非常确定我正确地选择了这个项目,我从未想过这可能是问题所在。

原来问题是两件事:

<强> 1) 我选择项目的方式,我使用listbox.Selecteditem = 1,现在如果我使用listbox.setSelected(1,true)一切都很好:)

<强> 2) 我获取项目文本的方式是错误的,listbox.SelectedValue是什么,它dosnt做我们都想象它做...我需要的调用是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一切正常....傻这个.net面向对象的东西,如果我这么说....

我必须说出一个笑话......那善意摧毁了我对面向对象编程的信念。 我知道这不是一个讨论四,但老实说调用SelectedValue.toString()应该做我们都认为它会做的事情....我们需要使用。不要使用.Text得到我们需要的东西0_o ....... ..