combolistbox.Item.Add(FileInfo) несовместим?

У меня есть небольшая проблема с этим методом.

Когда я перебираю объекты типа FileInfo в dragDropFiles и добавляю каждый по отдельности в CLB, я получаю свойство FullName (полный путь к файлу, что мне и нужно), возвращаемое при проверке элемента. Однако с hotFolderFiles вместо пути он дает мне только имя файла.

Я не понимаю этого, потому что они добавляют один и тот же тип объекта одинаковым образом.

(Я также пытался получить FileInfo для файлов горячих папок, используя DirectoryInfo вместо моего словаря с теми же результатами)

Почему такое поведение непоследовательно? (и как я могу заставить его возвращать полное имя fileInfo вместо имени?)

    public frmFilesFound(string hotFolderPath, Dictionary<string, FileInfo> dragDropFiles, Dictionary<string, FileInfo> hotFolderFiles, bool ReadOnly)
    {
        try
        {
            InitializeComponent();
            readOnly = ReadOnly;

            btnSelectAll.Visible = true;
            clbSelectFilesFound.Visible = true;
            clbSelectFilesFound.FormattingEnabled = true;
            clbSelectFilesFound.Format += (s, e) => { e.Value = string.Format("{0}", ((FileInfo)e.ListItem).Name); };


            foreach (FileInfo fileInfo in dragDropFiles.Values)
            {
                if (!clbSelectFilesFound.Items.Contains(fileInfo))
                {
                    try
                    {
                        // If file not already present, add it to listbox
                        clbSelectFilesFound.Items.Add(fileInfo);
                    }
                    catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); }
                }
            }
            //intended to be hot folder path
            if (!String.IsNullOrEmpty(hotFolderPath))
            {
                DirectoryInfo dirInfo = new DirectoryInfo(hotFolderPath);

                foreach (FileInfo fileInfo in dirInfo.GetFiles())
                //foreach (FileInfo fileInfo in hotFolderFiles.Values)
                {
                    if (!clbSelectFilesFound.Items.Contains(fileInfo))
                    {
                            try
                            {
                                clbSelectFilesFound.Items.Add(fileInfo);
                            }
                            catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); }
                    }
                }
            }
            lblDisplayedSelectMessage.Text = "More than one file is waiting.  Please select the files you would like to use.";
        }
        catch (Exception ex)
        { MessageBox.Show(ex.ToString()); }

    }

person negligible    schedule 02.04.2012    source источник


Ответы (2)


Это связано с тем, что метод DirectoryInfo.GetFiles заполняет только имя файла, а не полный путь.

Попробуйте этот форматтер, если вы хотите показывать только имя файла во всех случаях:

clbSelectFilesFound.Format += (s, e) => { e.Value = Path.GetFileNameWithoutExtension(((FileInfo)e.ListItem).Name); };

person huysentruitw    schedule 02.04.2012
comment
Я получаю тот же результат, когда использую свой словарь, см. закомментированную строку ниже, вместо GetFiles(). Однако метод словаря работает правильно в первом цикле ForEach. Мое форматирование работает по назначению. - person negligible; 02.04.2012
comment
Да, но мы не видим, откуда берутся файлы dragDropFiles и hotFolderFiles. Поэтому я могу только предложить этот обходной путь - person huysentruitw; 02.04.2012
comment
Я не понимаю, почему вы думаете, что это будет обходной путь, это имеет точно такой же эффект, как и мой существующий Formatter. (и мой вопрос был не о форматировании) И вы можете видеть, что dragDropFiles и hotFolderFiles исходят из конструктора... - person negligible; 02.04.2012
comment
Я вижу, это код в вашем обработчике Checked, который не делает то, что вы хотите. Имеет ли значение, какой путь вы передаете как hotFolderPath? Когда я тестирую это с помощью c:\\windows, я получаю полные пути при получении свойства FullName - person huysentruitw; 02.04.2012

Почему бы вам просто не добавить всегда Add(fileInfo.FullName) ?

person SimpleVar    schedule 02.04.2012
comment
В этом вся прелесть поля со списком, в него можно добавлять объекты. В противном случае, т.е. свойство SelectedItem не имело бы смысла. - person huysentruitw; 02.04.2012
comment
Затем установите для фильтра элемента данных значение FullName или пометьте элемент самим файлом Info для дальнейшего использования. - person SimpleVar; 02.04.2012
comment
Я добавляю объект, потому что я хочу отобразить имя файла в comboListBox, но я хочу использовать полное имя из результатов выбора. - person negligible; 02.04.2012
comment
о, вы хотите наоборот, я изменю свой ответ :) - person huysentruitw; 02.04.2012