2011-07-19 48 views
0

我有一个代表要处理的XML文件的类。我创建了这些对象的BindingList并将其绑定到DataGridView,以便用户(即我)可以“控制”一些事情并“看”发生了什么。默认情况下,构造函数采用列表中的所有文件都会被“加工”:通过我的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的最后2列用于显示从处理的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?

我想我需要的是“双向”绑定,但我可能不是?我关门了吗?

----------------- EDIT(UPDATE)----------------

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

是否XML文件已经存在外部?如果是的话,我会考虑用它来创建一个数据表 - 然后你可以添加一个布尔列到数据表中,以便绑定到网格,并在处理我们的数据视图时进行过滤,因此只有选定的项目。然后对这个视图中的项目进行一次初步探讨。 –

+0

供参考:http://msdn.microsoft.com/en-us/library/fx29c3yd.aspx http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx –

+0

并在答案到你原来的问题 - 我可能会循环遍历列表(你可以在datagridview行或列表项上使用foreach循环btw),主要是因为它将你的用户界面从你的逻辑上解耦了一点。是的,为此设置双向数据绑定。 –

回答

0

大卫·霍尔的评论(县)给了我足够的信心在这个方向走:

  • 离开的DataGridView作为从工具箱形式(即做不循环播放的直通DGV)
  • 环通的的BindingList集合

我参加了一个刺在这个代码,并张贴以上通过编辑原职。代码有效,但DGV没有正确反映出来。

所以,这个问题演变成如何实现我在(这个新的线程)打开一个DataGridView 2路结合不同的问题:How to use a static utility method for property setters in a utility class