我在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>
答案 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;
}