循环遍历我的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;
David Hall的评论给了我足够的信心朝着这个方向前进:
- 保持datagridview从工具箱到表单的原样(即不要通过DGV循环)
- 通过BindingList集合进行循环
我尝试了一下这段代码,并通过编辑原始帖子将其发布在上面。代码工作,但DGV不能正确反映它。
所以,这个问题演变成一个不同的问题如何实现双向绑定的datagridview,我打开了(这个新线程):如何使用一个静态实用工具方法的属性设置在一个实用工具类