2017-02-18 19 views
0

У меня есть gui, и я получаю данные о температуре от Uc. Я могу видеть данные в текстовом поле rich и сохранять в текстовый файл. Но я не понимаю, как сортировать сохраненные данные в формате столбца. Сейчас это длинный ряд данных. Пожалуйста посоветуй.Как сохранить данные в текстовом файле только в формате столбцов?

Было бы целесообразным заменить текстовое поле с расширением в нормальное текстовое поле?

У меня есть кнопка для сохранения данных в текстовом файле (button3_Click);

using System; 
using System.Windows.Forms; 
using System.IO.Ports; 
using System.IO; 
namespace Serial_receive 
{ 
    public partial class Form1 : Form 
    { 
     // All members variables should be placed here 
     // make it more readable, hopefully! 
     string t; 
     SerialPort sp; 

     public Form1() 
     { 
      InitializeComponent(); 
      Control.CheckForIllegalCrossThreadCalls = false; 

      // User can already search for ports when the constructor of the FORM1 is calling 
      // And let the user search ports again with a click 
      // Searching for ports function 

      SearchPorts(); 
     } 
     //search button 
     private void button1_Click(object sender, EventArgs e) 
     { 
      comboBox1.Items.Clear(); 
      SearchPorts(); 
     } 
     void SearchPorts() 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      foreach (string port in ports) 
      { 
       comboBox1.Items.Add(port); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      // Catch exception if it will be thrown so the user will see it in a message box 
      OpenCloseSerial(); 
     }  
     void OpenCloseSerial() 
     { 
      try 
      { 
       if (sp == null || sp.IsOpen == false) 
       { 
        t = comboBox1.Text.ToString(); 
        sErial(t); 
        button2.Text = "Close Serial port"; // button text 
       } 
       else 
       { 
        sp.Close(); 
        button2.Text = "Connect and wait for inputs"; // button text 

       } 
      } 
      catch (Exception err) // catching error message 
      { 
       MessageBox.Show(err.Message); // displaying error message 
      }   
     } 

     void sErial(string Port_name) 
     { 
      try 
      { 
       sp = new SerialPort(Port_name, 115200, Parity.None, 8, StopBits.One); // serial port parameters 
       sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
       sp.Open(); 
      } 
      catch (Exception err) 
      { 
       throw (new SystemException(err.Message)); 
      } 
     } 
// 
     private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) 
     { 

      // This below line is not need , sp is global (belongs to the class!!) 
      //SerialPort sp = (SerialPort)sender; 
      if (e.EventType == SerialData.Chars) 
      { 
       if (sp.IsOpen) 
       { 
        string w = sp.ReadExisting(); 
        if (w != String.Empty) 
        { 
         Invoke(new Action(() => richTextBox1.AppendText(w))); 
        } 
       } 
      } 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (sp == null || sp.IsOpen == false) 
      { 
       OpenCloseSerial(); 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.Text = "Serial Channel to FRDM-KW40Z"; 
     } 
     private void button3_Click(object sender, EventArgs e) 
     { 
      SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
      saveFileDialog1.InitialDirectory = @"C:\Users\varman\Documents\"; 
      saveFileDialog1.Title = "Save text Files"; 
      saveFileDialog1.CheckFileExists = true; 
      saveFileDialog1.CheckPathExists = true; 
      saveFileDialog1.DefaultExt = "txt"; 
      saveFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; 
      saveFileDialog1.FilterIndex = 2; 
      saveFileDialog1.RestoreDirectory = true; 

      if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       string temperature = "Temperature"; 
       string sorted = richTextBox1.Text.Replace(temperature, Environment.NewLine + temperature); 
       sorted = sorted.Substring(sorted.IndexOf(temperature)); 
       File.WriteAllText(saveFileDialog1.FileName, sorted); 
       Text += "\r\n"; 
       richTextBox1.Text = saveFileDialog1.FileName; 
      } 
     } 

     private void richTextBox1_TextChanged(object sender, EventArgs e) 
     { 
      richTextBox1.ScrollBars = ScrollBars.Both; 
     } 
    } 
} 

enter image description here

+1

Можете ли вы добавить код, задающий текст в RichTextBox, на вопрос? Потому что в этой части вам нужно добавить «Environment.NewLine» перед добавлением новой температуры. – KernelMode

+0

Вы хотите, чтобы текст был отсортирован в RichTextBox? в выходном файле? и то и другое? – KernelMode

ответ

1

Я предполагаю, что вы хотите отсортировать его только в выходной файл, поскольку вы не разделяют код, который изменит richTextBox1.Text.

Таким образом, вы можете добавить новую строку для каждой температуры перед запись в файл:

private void button3_Click(object sender, EventArgs e) 
    { 
     ... 

     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      string temperature = "Temperature"; 
      string sorted = richTextBox1.Text.Replace(temperature, Environment.NewLine + temperature); 
      File.WriteAllText(saveFileDialog1.FileName, sorted); 
      Text += "\r\n"; 
      richTextBox1.Text = saveFileDialog1.FileName; 
     } 
    } 

Добавьте эту строку кода перед File.WriteAllText, если вы хотите, чтобы написать текст, что улица искусства с «Температура» (таким образом, вы удалите «?????» в начале):

sorted = sorted.Substring(sorted.IndexOf(temperature)); 

EDIT: После последнего редактирования - вы добавили код, который обновляет RichTextBox. Поэтому вы можете сортировать по столбцу только в DataReceivedHandler. Смотрите ниже:

private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) 
{ 

      if (e.EventType != SerialData.Chars || !sp.IsOpen) 
      { 
       return; 
      } 

      string w = sp.ReadExisting(); 

      if (w != String.Empty) 
      { 
       string temperature = "Temperature"; 
       string sorted = w.Replace(temperature, Environment.NewLine + temperature); 
       Invoke(new Action(() => richTextBox1.AppendText(sorted))); 
      } 
} 

В основном то, что вы должны понять, что File.WriteAllText(fileName, input) где вы пишете input в файл, так что вы можете манипулировать input как вы хотите до этой линии. Если вы хотите изменить текст перед его диспетчером в RichTextBox, вам нужно увидеть, где вы выполняете что-то вроде richTextBox1.AppendText(input) или richTextBox1.Text = input, и сделайте все изменения, которые вы хотите, на input перед этой строкой.

+0

большое спасибо. Теперь я понимаю. Но это не универсально, не так ли? Я имею в виду, что этот метод сортирует вывод, основываясь на строке «Температура», которую я считаю. Или это верно для любого ввода, сохраненного в текстовом поле? Еще раз спасибо :) –

+0

Привет, также с этим подходом я больше не вижу данные в richTextBox. Но я могу получить обработанные данные. Любой совет? :) –

+0

Если вы не хотите очищать текст в RichTextBox, не устанавливайте имя файла в конце при сохранении. И вы правы, код предполагает, что вы хотите разделить текст на основе «Температура». Если вы хотите также сортировать RichTextBox, вам нужно поделиться кодом, который его заполняет. – KernelMode