0

「処理」する 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 の最後の 2 列は、処理された XML ファイルから出力された出力の数と、何らかのメッセージ(「OK」や「エラー テキスト」など) を配置する場所を表示するためのものです。

つまり、DataGridView をプロセスの視覚的表現にして、結果を 2 つの小さな列にエコーし、ユーザーがチェックを外すことで行をスキップできるようにしたいと考えています。

ボタンをクリックすると、DGV 内のファイルの処理が開始されます。これまでにスケッチしたものを次に示します (動作しているように見えますが、DGV は fileInfo.Rows および fileInfo.Message で行われた変更を反映していません)。

----- EDIT-UPDATE: 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 をループしますか?

必要なのは「双方向」バインディングだと思いますが、そうではないでしょうか?私は近いですか?

-----------------編集(更新)----------------

はい、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;
4

1 に答える 1

0

David Hall のコメントは、この方向に進むための十分な自信を与えてくれました。

  • ツールボックスからフォームへの datagridview をそのままにしておきます (つまり、DGV を介してループしないでください)。
  • BindingList コレクションをループします

私はこのコードを突き刺し、元の投稿を編集して上記に投稿しました。コードは機能しますが、DGV には正しく反映されません。

したがって、この質問は、私が開いたデータグリッドビューの双方向バインディングを実現する方法に関する別の質問に変わりました (この新しいスレッド):ユーティリティ クラスでプロパティ セッターに静的ユーティリティ メソッドを使用する方法

于 2011-07-22T17:17:16.607 に答える