我已经在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,而不是实际的文件名。
发布于 2018-04-06 12:18:36
首先,我们将用列表框中的名称来解决这个问题。默认情况下,C#中的对象在调用.ToString()时返回它们的类型名(这是列表框获取显示值的方法)。可以通过重写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的FileListbox属性设置为"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;
}https://stackoverflow.com/questions/49692559
复制相似问题