Элемент управления C # TextBox не обновляется с новым текстом - PullRequest
0 голосов
/ 11 мая 2011

Я разработчик программного обеспечения для встраиваемых систем для критически важных для безопасности систем, поэтому я довольно новичок в C #, но хорошо знаю языки на основе C.

Чтобы немного рассказать об этом, я разработал форму Windows, которая интерпретируетпакеты последовательных данных, отправленные из моего встроенного программного обеспечения через последовательный порт в значимую информацию отладки.

Что я хочу сделать, это отобразить каждый байт каждого пакета в элементе управления TextBox.Элемент управления 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 ]

1 голос
/ 11 мая 2011

Я полагаю, что вы устанавливаете свойство Text для экземпляра, отличного от того, который фактически отображается. Проверка работоспособности будет что-то вроде

RawSerialStreamTextBox.Visible = false;

Исчезает ли он?

0 голосов
/ 11 мая 2011

Для простоты я бы 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, обрабатывать обновлениесам по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...