Как запустить и связать AsyncBindingList со списком - PullRequest
0 голосов
/ 08 марта 2011

У меня есть приложение, в котором я перечисляю все файлы из выбранной папки. И у меня есть класс с именем FileManager, который содержит, AsyncBindingList, который связан с моим listBox на форме. вот код,

public class frmWriter : Form
{

    FileManager filemanager;  
    public frmWriter()
    {
        this.listBoxFilesFolder.DataSource = fileManager.FilesFolderList;
    }

    private void btnAddFolder_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog FolderDialog = new FolderBrowserDialog();
        FolderDialog.ShowNewFolderButton = false;           


        if (FolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            //if I call this function in the following way, My application will not give
            //any response to user mouse click. 
            filemanager.AddFileFolder(FolderDialog.SelectedPath);


        }

    }
}

public class FileManager
{
    AsyncBindingList<string> FilesFolderList;

    public FileManager()
    {
        FilesFolderList = new AsyncBindingList<string>();
    }

    public void AddFileFolder(string FolderSelected)
    {
        string[] Files = Directory.GetFiles(FolderSelected);
        //List<string> ValidFiles = new List<string>(); 

        foreach (string file in Files)
        {

            if (ValidateFile(file))
            {
                //Do some work
            }
        }
        string[] Folders = Directory.GetDirectories(FolderSelected);
        foreach (string folder in Folders)
            GetFilesFromFolder(folder);

        FilesFolderList.Add(FolderSelected);

    }

    private bool ValidateFile(string FilePath)
    {
        //This Function takes time to validate the file
        return true;
    }
}

Как лучше всего вызывать этот метод: filemanager.AddFileFolder, поэтому пользовательский интерфейс всегда реагирует на щелчки мышью.

если у вас есть какой-либо код или ссылки, пожалуйста, напишите.

Спасибо, Harsha

1 Ответ

1 голос
/ 08 марта 2011

Существует только два правила использования AsyncBindingList:

создание экземпляра AsyncBindingList в потоке пользовательского интерфейса, обновление AsyncBindingList (через один из его методов Add / AddNew / Insert / Delete / Clear) в фоновом потоке. AsyncBindingList

Вам потребуется реализовать поток (или BackgroundWorker для метода добавления:

public class FileManager
{
    public AsyncBindingList<string> FilesFolderList = new AsyncBindingList<string>();
    private BackgroundWorker bw = new BackgroundWorker();
    public FileManager()
    {
        bw.DoWork += GetFiles;
    }

    public void GetFiles(string startFolder)
    {
        bw.RunWorkerAsync(startFolder);
    }

    private void GetFiles(object sender, DoWorkEventArgs e)
    {
        var startFolder = e.Argument as string;
        if (startFolder == null)
        {
            e.Cancel = true;
            return;
        }

        var files = Directory.GetFiles(startFolder);
        var validFiles = Array.Find(files, ValidateFile);
        var folders = Directory.GetDirectories(startFolder);
        var folderFiles = Array.ForEach(folders, GetFilesFromFolder);

        FilesFolderList.Add(startFolder);
    }

    private List<string> GetFilesFromFolder()
    {
        return new List<string>();            
    }

    private bool ValidateFile(string FilePath)
    {
        //This Function takes time to validate the file
        return true;
    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...