Какова наилучшая практика проверки нескольких входных данных и безопасной обработки ввода-вывода файлов в приложении WPFC#

Место общения программистов C#
Anonymous
Какова наилучшая практика проверки нескольких входных данных и безопасной обработки ввода-вывода файлов в приложении WPF

Сообщение Anonymous »

Я разрабатываю настольное приложение WPF, предназначенное для обработки ввода данных счетов/квитанций (szamlak_gui) и добавьте его во внешний файл, выбранный пользователем. Пользовательский интерфейс состоит из текстовых полей для серийных номеров, дат и значений валют, а также полей со списком, динамически заполняемых из текстовых файлов при инициализации. В настоящее время моя логика полностью находится в файле кода программной части, где события нажатия кнопки запускают ручную проверку строки и анализируют целые числа непосредственно из элементов пользовательского интерфейса. Я использую OpenFileDialog, чтобы позволить пользователям выбирать целевой файл, а затем StreamWriter, вложенный в блок try-catch, чтобы добавить строку данных, разделенную точкой с запятой. Хотя текущая реализация функционально работает, глубоко вложенные блоки if-else для структурной проверки становятся беспорядочными и их трудно поддерживать. Кроме того, меня беспокоит то, что запуск диалоговых окон файлов непосредственно внутри логики хранения данных нарушает принципы разделения ответственности.
Какова рекомендуемая передовая практика в WPF для очистки этого типа рабочего процесса проверки с несколькими входами? Должен ли я перейти от ручной проверки текстовых полей к использованию встроенных WPF ValidationRules или вместо этого рассмотреть возможность реализации IDataErrorInfo через привязку данных? Кроме того, как я могу разделить механизм сохранения файлов и OpenFileDialog, чтобы операции пользовательского интерфейса и доступ к файловой системе были правильно разделены?
WPF:












































Код:
using Microsoft.Win32;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace szamlak_gui
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

List palyazatok = new List();
List koltseg_tipusok = new List();

using (StreamReader r = new StreamReader("kodok.txt"))
{
while (!r.EndOfStream)
{
palyazatok.Add(r.ReadLine());
}
}
using (StreamReader r = new StreamReader("koltseg_tipusok.txt"))
{
while (!r.EndOfStream)
{
koltseg_tipusok.Add(r.ReadLine());
}
}

melyik_szamla.ItemsSource = palyazatok;
melyik_szamla.SelectedIndex = 0;
koltseg_tipus.ItemsSource = koltseg_tipusok;
koltseg_tipus.SelectedIndex = 0;

}

private void Tarol_Click(object sender, RoutedEventArgs e)
{
string filename = "";

if (szamlaszam.Text.Trim() == "" || ertek.Text.Trim() == "" || datum.Text.Trim() == "")
{
MessageBox.Show("Hiányos adatok!");
return;
}
else if (!int.TryParse(ertek.Text, out int ertek_int) || ertek_int < 1 || ertek_int > 999999)
{
MessageBox.Show("Az értéknek számnak kell lennie és 1 és 999999 között!");
return;
}
else
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = "txt files OR CSV files (*.txt, *.csv)|*.txt;*.csv";
if (fileDialog.ShowDialog() == true)
{
filename = fileDialog.FileName;
}
else return;
try
{
using (StreamWriter sw = new StreamWriter(filename, true))
{
sw.WriteLine($"{melyik_szamla.SelectedItem};{szamlaszam.Text};{datum.Text};{ertek.Text};{koltseg_tipus.SelectedItem}");
}
}
catch (Exception err)
{
MessageBox.Show("Valami hiba történt!\n" + err.Message);
}
MessageBox.Show("Adat sikeresen hozzáadva!");
}
}

private void Megse_Click(object sender, RoutedEventArgs e)
{
melyik_szamla.SelectedIndex = 0;
koltseg_tipus.SelectedIndex = 0;
szamlaszam.Text = "";
ertek.Text = "";
datum.Text = "";
}

private void Kilep_Click(object sender, RoutedEventArgs e)
{
Application.Current.Shutdown();
}
}
}

Вернуться в «C#»