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

时间:2011-07-19 22:21:17

标签: c# .net datagridview bindinglist

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

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

单击按钮开始处理DGV中的文件。这是我到目前为止草拟的内容(似乎有效,但DGV不反映在fileInfo.Rows和fileInfo.Message中所做的更改):

-----编辑更新:根据David Hall的建议,通过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?

我认为我需要的是“双向”绑定但我可能不是吗?我接近了吗?

----------------- 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;

1 个答案:

答案 0 :(得分:0)

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

  • 将datagridview从工具箱中保留为表单(即不要通过DGV循环)
  • 循环通过BindingList集合

我对此代码进行了一次尝试,并通过编辑原始帖子将其发布在上面。代码可以工作,但DGV没有正确反映它。

所以,这个问题演变成一个不同的问题,关于如何为我打开的数据网格视图实现双向绑定(这个新线程):How to use a static utility method for property setters in a utility class