从Invoke方法中获取返回值

3

我试图从另一个线程中的列表框项读取值。

我尝试编写一个新的方法来运行调用命令,我可以通过调用方法向列表框发送add等命令,但是我似乎无法获得响应,也无法获取该项的值,我尝试了几种方法,一旦将其从void更改为string,事情就开始变得棘手起来...

  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未被用户代码处理 消息=未将对象引用设置到对象的实例。 源=** StackTrace: 在***。Form1.readListBoxSelected(ListBox listbox)中 e:\ documents和settings \ scott \ my documents \ visual studio 2010 \ Projects ** * * ** \ Form1.cs:第133行 在***。Form1.<> c_<DisplayClass5.b> _3() e:\ documents和settings \ scott \ my documents \ visual studio 2010 \ Projects ** * * ** \ Form1.cs:第127行InnerException:
我想,问题就是如其所述“未将对象引用设置为对象的实例”……据我所知,我的所有变量都已声明完毕,我应该怎样纠正这个问题??
我有种感觉整个事情都错了....0_o 提前致谢, Scott
3个回答

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

谢谢你的修复,我不明白为什么它返回 null,我的意思是列表框项目是通过代码选择的,它返回 null,如果我在应用程序中使用鼠标选择它,它仍然包含 null,但是列表框却充满了文本..... - scott
现在正常工作,谢谢你们两个的帮助。问题是我直接选择了该项,我需要使用invoke来选择它... - scott
你的意思是想通过编程方式选择项目,而不是通过用户点击吗? - DeveloperX

1

代码看起来没问题,问题似乎出在SelectedValue上,它是null吗???


我同意,可能selectedvalue为空,你正在尝试将其转换为字符串。 - DeveloperX
选定的值肯定不为空,因为我在点击开始按钮运行代码之前已经选择了它。 - scott
嗯,我在那里加了一个messagebox.show来查看发生了什么,似乎它总是返回null...然而listbox项目已被选中... - scott
列表框的选择方式如下: int i = 1; while(i <= listBox1.Items.Count) { listBox1.SelectedItem = i; - scott
好的,我想我解决了问题。我需要调用列表框来选择一个项目,而且是从另一个线程中进行操作。当我可以使用 "CheckForIllegalCrossThreadCalls=false" 时,这就容易多了。哈哈哈 - scott
好的,它返回NULL只是因为listbox.SelectedValue并不是我想要读取所选值的调用(你可能认为它是),如果我将其更改为listbox1.text,一切都正常... - scott

0

谢谢大家,

你们是对的,问题是它返回了一个空值。我非常确定我正确地选择了该项,从未想过它可能是问题所在。

结果问题有两个:

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 在运行时支持吗...

为每个东西编写单独的委托好像很浪费时间...

谢谢大家,现在一切正常了,昨天我无法预见自己能达到这一点, 总体问题是错误的调用,调用本身没什么问题 :)

Scott

编辑:

好吧,它返回 NULL 只是因为 listbox.SelectedValue 不是我要读取选定值所需的调用(你会认为它是),如果我将其更改为 listbox1.text,所有问题都可以解决....如果我这样说 .net 面向对象的东西相当愚蠢....

我必须说这真是个笑话...这种东西已经摧毁了我对面向对象编程的信心... 我知道这不是一个讨论论坛,但老实说,所谓的 SelectedValue.toString() 调用应该做我们所有人认为它会做什么....不是的,我们需要使用 .Text 来获得我们需要的内容 0_o.........


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接