У меня есть класс, который представляет XML-файл для «обработки».Я создал BindingList этих объектов и связал его с DataGridView, чтобы пользователь (т.е. я) мог немного «контролировать» вещи и «видеть», что происходит.По умолчанию конструктор предполагает, что все файлы в списке будут «обработаны»:
public class InputFileInfo : INotifyPropertyChanged
{
private bool processThisFile;
public bool Process
{
get { return processThisFile; }
set
{
processThisFile = value;
this.NotifyPropertyChanged("Process");
}
}
public string FileName { get; set; }
public int Rows { get; set; }
public string Message { get; set; }
// constructor
public InputFileInfo(string fName)
{
Process = true;
FileName = fName;
Rows = 0;
Message = String.Empty;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
Первый столбец DGV с именем «Процесс» может стать непроверенным, и в этом случае я хочу пропустить этот файл (т.е.строка) и продолжить со следующей.Последние 2 столбца DGV предназначены для отображения количества выходных строк , которые были отправлены из обработанного XML-файла, и места для размещения какого-либо сообщения (например, "ОК "или" текст ошибки ").
Короче говоря, я хочу, чтобы DataGridView был визуальным представлением процесса, отображая результаты в 2 маленьких столбцах и позволяя пользователю пропустить строку, сняв ее флажок.
Нажатие на кнопку запускает обработку файлов в DGV.Вот что я набросал до сих пор (кажется, работает, но DGV не отражает изменения, сделанные в fileInfo.Rows и fileInfo.Message):
----- EDIT-UPDATE: согласно предложению Дэвида Холла,цикл через BindingList (_filesToParse) является хорошим решением этой проблемы (рабочий код приведен ниже):
private void btnProcess_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream("output-file.txt", FileMode.Create);
StreamWriter writer = new StreamWriter(fs);
OutputColumnNamesAsFirstLine(writer);
foreach (InputFileInfo fileInfo in _filesToParse)
{
if (fileInfo.Process == true)
{
try
{
fileInfo.Rows = processFile(writer, fileInfo.FileName);
}
catch (Exception ex)
{
log.Warn("Error processing DataGridView:\r\n", ex);
}
}
else
{
fileInfo.Rows = 0;
fileInfo.Message = "skipped";
}
}
writer.Dispose();
fs.Dispose();
MessageBox.Show("All selected files have been processed.");
}
Какой будет наилучший подход?
- Цикл через BindingList?
- Цикл через DataGridView?
Я думаю, что мне нужно "двустороннее" связывание, но я не могу?Я близко?
----------------- РЕДАКТИРОВАТЬ (ОБНОВИТЬ) ----------------
Да, файлы XML уже существуют.Вот как работает эта часть:
private void initializeFileList(string rootFolder) // populate grid with .xml filenames to be processed
{
String root = rootFolder;
var result = Directory.GetFiles(root, "*.xml", SearchOption.AllDirectories)
.Select(name => new InputFileInfo(name))
.ToList();
_filesToParse = new BindingList<InputFileInfo>(result.ToList());
dataGridView1.DataSource = _filesToParse;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
btnProcess.Visible = true;