Перебрать мою коллекцию BindingList или DataGridView, к которому она привязана - PullRequest
0 голосов
/ 20 июля 2011

У меня есть класс, который представляет 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;

1 Ответ

0 голосов
/ 22 июля 2011

Комментарии (и) Дэвида Холла дали мне достаточно уверенности, чтобы двигаться в этом направлении:

  • оставить сетку данных без изменений от набора инструментов до формы (т.е. НЕ проходить через DGV)
  • Цикл через коллекцию BindingList

Я сделал удар по этому коду и разместил его выше, отредактировав исходное сообщение.Код работает, но DGV не отражает его должным образом.

Итак, этот вопрос перерос в другой вопрос о том, как добиться двухстороннего связывания для представления данных, который я открыл (в этой новой теме): Как использовать метод статической утилиты для установщиков свойств вслужебный класс

...