2017-02-16 11 views
0

У меня есть текстовое поле в моем приложении, которое я хотел бы, чтобы пользователи могли вводить строку и вставлять в нее, что добавляет эту строку в переменную и очищает текстовое поле. Они могут добавлять несколько строк к переменной через текстовое поле, каждое из которых разделяется запятой. Но когда я добавляю полную запись в свой файл csv, у нее есть двойные запятые. Я не вижу, где они добавляются.UWP C# Устранение двойной запятой из textbox.txt

желаемого результата 1/1/2017,12: 00, Джо, из, 1234,09112,4545,120034

, что я получаю в настоящее время 1/1/2017,12 : 00, Джо, из, 1234,, 09112,, 4545,, 120034 ,,

здесь соответствующий код:

 private void meterNumberBox_KeyDown(object sender, KeyRoutedEventArgs e) 
     { 
      if (e.Key == Windows.System.VirtualKey.Enter) 
      { 
       singlescan = meterNumberBox.Text + ","; 
       meternumber += singlescan; 
       meterNumberBox.Text = ""; 
       singlescan = ""; 

      } 
     } 


     private async void SubmitButton_Click(object sender, RoutedEventArgs e) 
     { 
      action = "out"; 

      // create record to be added to CSV 
      recordline = DateTime.Today.ToString("MM/dd/yyyy") + ","; 
      recordline += DateTime.Now.ToString("HH:mm:ss"); 
      recordline += ","; 
      recordline += checkoutName; 
      recordline += ","; 
      recordline += action; 
      recordline += meternumber; 
      recordline += "\r\n"; 

// then it submits the recordline to the record file. 
     // open csv and append record 
     StorageFolder appStoragefolder = ApplicationData.Current.RoamingFolder; 
     StorageFile appRecordFile = await appStoragefolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists); // if it doesn't exist it will be created 
     var stream = await appRecordFile.OpenAsync(FileAccessMode.ReadWrite); 
     using (var outputstream = stream.GetOutputStreamAt(stream.Size)) 
     { 
      using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputstream)) 
      { 
       dataWriter.WriteString(recordline); 
       await dataWriter.StoreAsync(); 
       await outputstream.FlushAsync(); 
      } 
     } 

     stream.Dispose(); 

Я думаю, что я могу устранить двойной запятые из recordline с .repl ace(), но я действительно хочу понять, что я делаю неправильно, чтобы вызвать проблему.

Спасибо за любой ввод!

Редактировать: После немного большего количества испытаний оказывается, что enter ударяется дважды при каждом нажатии клавиши Enter. Не знаю, почему.

+0

Без хорошего [mcve] невозможно будет дать хороший ответ с конкретными советами. Тем не менее, основываясь на том, что вы написали, кажется, все в порядке. Кажется, вы используете реализацию CSV, которая использует двойную запятую, чтобы избежать запятой (требуется, поскольку одна запятая ограничивает поля в строке в файле). Пока вы используете ту же реализацию CSV для чтения файла, я ожидаю, что он будет правильно декодировать скрытые запятые. –

+0

Я отредактировал свой вопрос, чтобы показать, что я просто добавляю строку в текстовый файл, не используя методы обработки CSV. – JayCee

+0

Кроме того, здесь нет ничего, что помешало бы пользователю нажать Enter, пока текстовое поле пуст, что приведет к дополнительной запятой. Не обязательно то, что происходит сейчас, но что-то, о чем нужно знать. – dazedandconfused

ответ

0

Поняв, что мне нужно было искать с фразой «UWP keydown event firing two», я обнаружил ответ на мою проблему. На основе статьи в блоге и сообщения здесь кажется, что это ошибка в Windows 10 UWP-приложениях.

http://blog.mzikmund.com/2015/12/winrt-keydown-fired-twice-when-enter-is-pressed/

и

Keydown Event fires twice

Я был в состоянии решить мою частный случай, добавив:

if (e.KeyStatus.RepeatCount == 1) 
{ 
    //Execute code 
} 

Так мой последний обработчик событий выглядит следующим образом:

private async void meterNumberBox_KeyDown(object sender, KeyRoutedEventArgs e) 
{ 
    if (e.Key == Windows.System.VirtualKey.Enter) 
    { 
     if (e.KeyStatus.RepeatCount == 1) 
     { 
      singlescan = meterNumberBox.Text + ","; 
      meternumber += singlescan; 
      singlescan = ""; 
      meterNumberBox.Text = ""; 
     } 
    } 

}