2011-07-19 29 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

相關問題