我有一个代表要处理的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;
是否XML文件已经存在外部?如果是的话,我会考虑用它来创建一个数据表 - 然后你可以添加一个布尔列到数据表中,以便绑定到网格,并在处理我们的数据视图时进行过滤,因此只有选定的项目。然后对这个视图中的项目进行一次初步探讨。 –
供参考:http://msdn.microsoft.com/en-us/library/fx29c3yd.aspx http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx –
并在答案到你原来的问题 - 我可能会循环遍历列表(你可以在datagridview行或列表项上使用foreach循环btw),主要是因为它将你的用户界面从你的逻辑上解耦了一点。是的,为此设置双向数据绑定。 –