暂停富文本框然后再次恢复

时间:2016-01-18 21:22:02

标签: c# winforms serial-port

我在做什么:

我每隔一秒从串口收到一串数据。我正在处理它,并在富文本框中显示此字符串。

问题:

我希望用户遍历旧字符串并复制任何字符串,但是用户无法执行此操作,因为数据每秒都会发生并且会自动滚动。

我想要的解决方案:

我想要一个“暂停”复选框。当用户检查它时,富文本框的更新停止。用户可以进入历史记录并复制字符串。但同时我不希望从串口停止传入的字符串,因为我正在做其他事情以及传入的字符串。

因此,当用户取消选中“暂停”复选框时,用户选中“暂停”复选框时早先到达的所有字符串也会出现在富文本框中以及新文本框中。

有办法吗?

1 个答案:

答案 0 :(得分:2)

假设当您选中“暂停”按钮时,每个传入的文本都会附加到StringBuilder而不是RichTextBox。当用户取消选中“暂停”按钮时,您将从StringBuilder复制到RichTextBox

// Assume that these are somewhere globals of your forms
RichTextBox rtb = new RichTextBox();
CheckBox chkPause = new CheckBox();
StringBuilder sb = new StringBuilder();

protected void chkPause_CheckedChanged(object sender, EventArgs e)
{
    if(!chkPause.Checked)
    {
        rtb.AppendText = sb.ToString();
        // Do not forget to clear the buffer to avoid errors 
        // if the user repeats the stop/go cycle.
        sb.Clear();
    }
    else
    {
        // Start a timer to resume normal flow after a timer elapses.
        System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
        t.Interval = GetSuspensionMilliseconds();
        t.Tick += onTick;
        t.Start();
    }
}

protected void onTick(object sender, EventArgs e)
{
    if (chkPause.Checked)
    {
        // Set to false when the timing elapses thus triggering the CheckedChanged event 
        chkPause.Checked = false;
        System.Windows.Forms.Timer t = sender as System.Windows.Forms.Timer;
        t.Stop();
    }
}

现在将传入数据传递给RichTextBox,您可以添加

....
string incomingData = ReceiveDataFromSerialPort();
if(chkPause.Checked)
   sb.AppendLine(incomingData);
else
   rtb.AppendText = incomingData;