C#TextBox控件不使用新文本更新

时间:2011-05-11 18:55:47

标签: c# string textbox updating

我是安全关键系统的嵌入式系统软件开发人员,因此我对C#相当新,但精通基于C语言。

为了提供一点背景知识,我开发了一个Windows窗体,它将从我的嵌入式软件通过串口发送的串行数据包解释为有意义的调试信息。

我想要做的是在TextBox控件中显示每个数据包的每个字节。显示数据包信息的文本框控件实际上是第一个表单打开的第二个表单。这是从第一个窗口打开第二个窗体的事件处理程序的代码:

private void ShowRawSerialData(object sender, EventArgs e)
{
    SendSerialDataToForm = true;
    if (SerialStreamDataForm == null)
        SerialStreamDataForm = new RawSerialDataForm();
    SerialStreamDataForm.Instance.Show();
}

在上面的代码中,.Instance.Show()指令是一种方法,如果表单已关闭,我可以通过该方式打开新表单,但如果表单已经打开则不显示新表单。 然后,在我的串行数据接收事件处理程序中,我这样做:

// Get bytes from the serial stream
bytesToRead = IFDSerialPort.BytesToRead;
MsgByteArray = new Byte[bytesToRead];
bytesRead = IFDSerialPort.Read(MsgByteArray, 0, bytesToRead);
// Now MsgByteArray has the bytes read from the serial stream,
// send to raw serial form
if (SendSerialDataToForm == true && SerialStreamDataForm != null)
{
    SerialStreamDataForm.UpdateSerialDataStream(MsgByteArray);
}

其中MsgByteArray是收到的串行数据包的字节数组。这是UpdateSerialDataStream的代码:

public void UpdateSerialDataStream(Byte[] byteArray)
{
    String currentByteString = null;
    currentByteString = BitConverter.ToString(byteArray);
    currentByteString = "0x" + currentByteString.Replace("-", " 0x") + " ";
    if (RawSerialStreamTextBox.InvokeRequired)
    {
        RawSerialStreamTextBox.Invoke(new SerialTextBoxDelegate(this.UpdateSerialDataStream), new object[] { byteArray });
    }
    else
    {
        RawSerialStreamTextBox.Text += currentByteString;
    }
    RawSerialStreamTextBox.Update();
}

最终结果是RawSerialStreamTextBox.Text的值使用我打算添加到文本框的字符串正确更新!例如,如果我传递字节数组{0x01,0x7F,0x7E},那么,通过调试器,我可以看到RawSerialStreamTextBox.Text =“0x01 0x7F 0x7E”的值。

问题是文本框控件本身不显示新添加的文本。因此,即使我可以通过调试器确认RawSerialStreamTextBox.Text =“0x01 0x7F 0x7E”,Windows中的文本框也不显示“0x01 0x7F 0x7E”,而是保持空白。

对于这里可能发生的事情的任何想法?

2 个答案:

答案 0 :(得分:1)

我猜你是在实际显示的实例之外的实例上设置Text属性。理智检查就像是

RawSerialStreamTextBox.Visible = false;

它会消失吗?

答案 1 :(得分:0)

为了简化一点,我会UpdateSerialDataStream返回一个字符串(或将字符串传递给out参数),这样你的事件处理程序就会像这样:

    // Get bytes from the serial stream
    bytesToRead = IFDSerialPort.BytesToRead;
    MsgByteArray = new Byte[bytesToRead];
    bytesRead = IFDSerialPort.Read(MsgByteArray, 0, bytesToRead);
    // Now MsgByteArray has the bytes read from the serial stream,
    // send to raw serial form
    if (SendSerialDataToForm == true && SerialStreamDataForm != null)
    {
        RawSerialStreamTextBox.Text = UpdateSerialDataStream(MsgByteArray);
    }

UpdateSerialDataStream看起来像这样:

public string UpdateSerialDataStream(Byte[] byteArray)
{
    String currentByteString = null;
    currentByteString = BitConverter.ToString(byteArray);
    currentByteString = "0x" + currentByteString.Replace("-", " 0x") + " ";
    return currentByteString;
}

您必须将处理表单显示的代码移动一点,但这样就可以使已包含TextBox的表单自行处理更新。