Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从调用方法获取返回_C#_Multithreading_Listbox_Invoke - Fatal编程技术网

C# 从调用方法获取返回

C# 从调用方法获取返回,c#,multithreading,listbox,invoke,C#,Multithreading,Listbox,Invoke,我试图从另一个线程上的列表框项中读取值 我尝试了一个新的方法来运行invoke命令,我可以通过invoke方法向列表框发送一个命令,比如add,但我似乎无法得到响应,我似乎无法获得项的值,我尝试了几种方法,一旦我将它从一个空值更改为字符串,事情开始变得棘手 thread t1 = new thread(thethread) t1.start() public void thethread() { string text = readListBoxSelect

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

我尝试了一个新的方法来运行invoke命令,我可以通过invoke方法向列表框发送一个命令,比如add,但我似乎无法得到响应,我似乎无法获得项的值,我尝试了几种方法,一旦我将它从一个空值更改为字符串,事情开始变得棘手

  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;
        }
        }
threadt1=新线程(thethread)
t1.start()
public void thethread()
{
字符串文本=readListBoxSelected(listBox1)+“拉拉”;
}
公共静态字符串readListBoxSelected(ListBox ListBox)
{
if(listbox.invokererequired)
{
返回(字符串)listbox.Invoke(
新建函数(()=>readListBoxSelected(listbox))
);
}
其他的
{
string varText=listbox.SelectedValue.ToString();
返回varText;
}
}
以上是我正在尝试做的一个例子

以下是错误:

System.NullReferenceException被删除 未由用户代码处理
消息=对象引用未设置为 对象的实例。
Source=**堆栈跟踪: 在e:\documents和 设置\scott\my documents\visual 演播室 2010\Projects*****\Form1.cs:line 133 在***.Form1.c_DisplayClass5.b_3() 在e:\documents and settings\scott\my中 文档\ visual studio 2010\Projects*******\Form1.cs:line 127.例外情况:

我想问题就在于它说的“对象引用未设置为对象的实例”。。。。。。。就我所知,我所有的变量似乎都被宣布为公平的,我如何才能纠正这一点

我觉得我把整件事都搞错了。。。。0_o 提前感谢,,
Scott

代码看起来很好,问题似乎出现在SelectedValue上,它是空的吗

试试这个

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
        }
        }
public静态字符串readListBoxSelected(ListBox-ListBox)
{
if(listbox.invokererequired)
{
返回(字符串)listbox.Invoke(
新建函数(()=>readListBoxSelected(listbox))
);
}
其他的
{
如果(istbox.SelectedValue!=null)
返回listbox.SelectedValue.ToString();
其他的
返回字符串。空
}
}
谢谢各位

在正确的情况下,问题是它返回了一个空值。。 我非常确信我选择的项目是正确的,我从来没有想到这可能是个问题

事实证明问题在于两件事:

1) 我选择项目的方式是使用listbox.Selecteditem=1,现在如果我使用listbox.setSelected(1,true)一切正常:)

2) 我获取项目文本的方式是错误的,listbox.SelectedValue什么都不是,它不做我们都想象的事情。。。我需要的电话是listbox.Text……

public静态字符串readListBoxSelected(ListBox-ListBox)
{
if(listbox.invokererequired)
{
返回(字符串)listbox.Invoke(
新建函数(()=>readListBoxSelected(listbox))
);
}
else if(listbox.Text!=null)
{
返回listbox.Text.ToString();
} 
其他的
返回字符串。空;
}
public void selectListBoxItem(ListBox ListBox,int num)
{
Invoke(newmethodinvoker(委托{listbox.SetSelected(num,true);}));
}
我必须说这是我做过的最令人焦虑的事。。。一切都需要我为它编写一个委托/调用方法。。。一切。。。难道.net不支持这么普通的东西吗

似乎要花很长时间来为每件事编写单独的代表

谢谢大家现在都在工作,昨天我没想到我会走到这一步, 整体问题是错误的调用,调用一切正常:)

斯科特

编辑:

确定返回空值只是因为listbox.SelectedValue并不是我真正想要读取SelectedValue(你可能会认为是)的调用,如果我将其更改为listbox1.text,则一切正常。。。。如果我这么说的话,这个.net面向对象的东西是相当愚蠢的…

我必须说,这真是个笑话。。。这很好地摧毁了我对面向对象编程的信心。。
我知道这不是一个讨论,但老实说,调用SelectedValue.toString()应该做我们都认为它会做的事情。。。。不,我们需要使用。文本来获取我们需要的内容0_o………

我同意,可能被选中值为null,您正在尝试将其转换为stringhmm所选值防御不为null,因为我在单击“开始”按钮运行代码之前选择了它。嗯,我在tehre中插入了一个messagebox.show以查看发生了什么,似乎它总是返回空值。。。然而,listbox项被选中了…]listbox的选择方式如下:int i=1;虽然(我好的,我想我已经把它整理好了,我需要调用listbox来实际选择一个项目。从另一个线程…当我可以去的时候非常容易…CheckForIllegalCrossThreadCalls=false;Lollhmm谢谢你的修复,我无法理解为什么它返回null,我的意思是listbox项目是通过代码选择的,它返回null,如果我选择在应用程序中用鼠标点击它,它仍然包含空值,但列表框中充满了文本…现在正在工作,谢谢你们,问题是我直接选择了项目,我还需要使用invoke来选择它…你是说你想通过编程而不是用户点击来选择项目吗?
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); }));
}