无法转换类型为' System.String'的对象输入' FileItem'

时间:2018-04-06 12:11:17

标签: c#

我在ListBox中使用其路径加载了一个文本文件,但是当我点击列表框项时,我收到以下错误:

  

无法转换类型为' System.String'的对象输入' FileItem'。

我的代码:

public class FileItem
{
    public string Title { get; set; }
    public string Path { get; set; }
}

bool modelnameonly;

void reciperefresh()
{
    FileListbox.Items.Clear();

    string[] files = Directory.GetFiles(@"C:\Recipe", "*.txt", SearchOption.AllDirectories);

    foreach (string f in files)
    {
        var fileItem = new FileItem
        {
            Title = Path.GetFileName(f), 
            Path = Path.GetFullPath(f)
        };
        FileListbox.Items.Add(fileItem.Title);
    }
}

string Fileloadpath;

private void FileListbox_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedItems = FileListbox.SelectedItems.Cast<FileItem>();
    var all = string.Join(Environment.NewLine, selectedItems.Select(x => x.Path).ToArray());
    FileLoadpath = all;
}

如果我从Title删除FileListbox.Items.Add(fileItem.Title);,则错误消失,但ListBox中显示的文字是 OpenCV.Form1 + fileitem ,而不是实际的文件名。< / p>

1 个答案:

答案 0 :(得分:4)

首先,我们将使用列表框中的名称解决问题。默认情况下,当您调用.ToString()时,C#中的对象将返回其类型名称(这是列表框获取显示值的方式)。您可以通过覆盖FileItem班级ToString()方法来解决此显示问题:

public class FileItem
{
    public string Title { get; set; }
    public string Path { get; set; }

    public override string ToString()
    {
        return this.Title;
    }
}

或者,正如M Bakardzhiev在评论中提到的那样,您可以简单地将FileListbox的DisplayMember属性设置为“Title”。

现在您只需将fileItem添加到列表框中即可:

FileListbox.Items.Add(fileItem);

现在,您的代码应该可以运行:

string Fileloadpath;
private void FileListbox_SelectedIndexChanged(object sender,
    EventArgs e)
{
    var selectedItems = FileListbox.SelectedItems.Cast<FileItem>();
    var all = string.Join(Environment.NewLine, selectedItems.Select(x
    => x.Path).ToArray());
    FileLoadpath = all;

}