当InvokeRequired == false时,TextBox丢失文本

时间:2010-05-20 06:14:34

标签: c# winforms

这是我在本网站上找到的修改后的代码。

当向TextBox附加文本并且InvoveRequired为false时,文本将显示在框中,但是下次调用该函数并且InvokeRequired为true时,第一次调用所放置的文本字符串将丢失(“”)。当InvokeRequired为true时多次调用按预期工作。

comBox是一个类型为Textline且multline = true。

任何帮助都将不胜感激。

 public void LogComText(string comText, bool newline)
    {
        if (comBox.InvokeRequired)
        {

            comBox.BeginInvoke(new Action(delegate
            {
                LogComText(comText, newline);
            }));
            return;
        }
        comBox.AppendText(comText);
        if (newline) comBox.AppendText(Environment.NewLine);


    }

1 个答案:

答案 0 :(得分:2)

这看起来应该可行,也许它与并发有一些关系 尝试使用comBox.Invoke(...)代替comBox.BeginInvoke(...)
更新: 当您使用BeginInvoke时,可能无法调用方法调用。
这是错误的,对InvokeBeginInvoke的调用按顺序执行。

修改
它不起作用确保您没有任何其他地方可以更改comBox中的文本。

如果它仍然不起作用,您可能需要创建一个锁,以确保没有两个线程同时写入文本框。

这样的事情:

private static readonly object _comBoxSyncObj = new object();
public void LogComText(string comText, bool newline)
{
    if (comBox.InvokeRequired)
    {
        comBox.Invoke(new Action(delegate
        {
            LogComText(comText, newline);
        }));
        return;
    }
    lock (_comBoxSyncObj)
    {
        comBox.AppendText(comText);
        if(newline) comBox.AppendText(Environment.NewLine);
    }
}

<强> EDIT2:
如果问题仍然存在,您可以为TextChanged事件添加事件处理程序,并在文本框被清除时在其中放置断点。

在comBox上添加此方法和TextChanged的事件处理程序:

private void comBox_TextChanged(object sender, EventArgs e)
{
    if (comBox.TextLength == 0)
    {
        // Set a breakpoint here.
        Trace.WriteLine("TextBox empty");
    }
}