循环遍历我的BindingList集合或绑定到的DataGridView

本文关键字:绑定 DataGridView 集合 遍历 我的 BindingList 循环 | 更新日期: 2023-09-27 18:02:30

我有一个表示要"处理"的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名为"Process"的第一列可能未检查,在这种情况下,我想跳过该文件(即行)并继续下一个。DGV的最后两列用于显示从处理过的XML文件发出的输出行数,以及放置某种消息的位置(例如"OK"或"错误文本")。

简而言之,我希望DataGridView是进程的可视化表示,在2个小列中响应结果,并允许用户通过取消选中来跳过一行。

点击按钮开始处理DGV中的文件。这是我迄今为止所绘制的草图(似乎有效,但DGV没有反映在fileInfo中所做的更改。

----- EDIT-UPDATE:根据David Hall的建议,循环通过BindingList (_filestopparse)是一个很好的修复这个问题(以下是工作代码):

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循环?

我想我需要的是"双向"绑定,但我可能不需要?我离得近吗?

----------------- E D I T(更新 )----------------

是的,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;

循环遍历我的BindingList集合或绑定到的DataGridView

David Hall的评论给了我足够的信心朝着这个方向前进:

  • 保持datagridview从工具箱到表单的原样(即不要通过DGV循环)
  • 通过BindingList集合进行循环

我尝试了一下这段代码,并通过编辑原始帖子将其发布在上面。代码工作,但DGV不能正确反映它。

所以,这个问题演变成一个不同的问题如何实现双向绑定的datagridview,我打开了(这个新线程):如何使用一个静态实用工具方法的属性设置在一个实用工具类