已填充的ListView被视为空
本文关键字:ListView 填充 | 更新日期: 2023-09-27 18:02:33
我有一个ListView控件,它是绝对填充。问题是它被当作是空的。当指定一个项目的索引时,我知道在那里,我得到一个"ArgumentOutOfRangeException"错误。
public static string folderToUpdate(string folderChanged)
{
Main m = new Main(); // This is the class which this method is in,
// as a side matter I don't even know why I have to create
// an instance of the class I'm ACTUALLY IN
// (but I get a compile time error if I don't).
string folder1 = m.lstFoldersToSync.Items[0].Text;
string folder2 = m.lstFoldersToSync.Items[1].Text;
string folderToUpdate;
// If the folder changed is folder1 then the folder to update must be folder2.
// If the folder changed is folder2 then the folder to update must be folder1.
if (folderChanged == folder1)
{
folderToUpdate = folder2;
}
else
{
folderToUpdate = folder1;
}
return folderToUpdate;
}
错误出现在第8行,在这里我声明并定义了"folder1"。
一些澄清:我在发布之前已经广泛搜索了。没有其他问题是完全重复的。有许多类似的问题,但解决方案总是被证明是一个空列表问题或"Off-by-one错误",这两个都不是我遇到的问题。我再次强调Listview被填充(在表单加载时)。
那么它会是什么呢?问题可能与Main m = new Main();
有关吗?
任何帮助都将非常感激。谢谢你。
PS:我认为除了第3行、第8行和第9行之外的所有代码都是无关紧要的(我可能错了)。
编辑:我通过使用包含"lstFoldersToSync"控件的内容的静态字段列表解决了这个问题,然后访问它(而不是试图直接访问控件的内容)。
新的工作代码:
private static List<string> foldersToSync = new List<string>(); // This will be populated with the items in "lstFoldersToSync" control on "Main" form.
public static string folderToUpdate(string folderChanged)
{
// Main m = new Main();
string folder1 = foldersToSync[0];
string folder2 = foldersToSync[1];
string folderToUpdate;
// If the folder changed is folder1 then the folder to update must be folder2.
// If the folder changed is folder2 then the folder to update must be folder1.
if (folderChanged == folder1)
{
folderToUpdate = folder2;
}
else
{
folderToUpdate = folder1;
}
return folderToUpdate;
}
非常感谢那些帮助过我的人。
是的,你的问题是m = new Main()
部分。您需要以某种方式获取对表单的引用,而不是创建一个新表单。
要获取表单上的选定文件夹,最佳实践是在表单上创建一个属性。
因为它是静态的,所以您需要将窗体/窗口或控件的引用传递给该方法。
我会考虑重写这个方法,这样你就不需要传递对任何UI元素的引用了。
public static string folderToUpdate(string folderChanged, List<string> foldersToSync)
{
string folder1 = foldersToSync[0];
string folder2 = foldersToSync[1];
// Keep the rest the same
...
...
}
然后你可以这样调用它,从你的ListView
发送文件夹名称列表:
yourClass.folderToUpdate("SomeFolderName",
lstFoldersToSync.Items.Select(i => i.Text);
我已经通过使用包含"lstFoldersToSync"控件的内容的静态字段列表解决了这个问题,然后访问它(而不是试图直接访问控件的内容)。
新的工作代码:
private static List<string> foldersToSync = new List<string>(); // This will be populated with the items in "lstFoldersToSync" control on "Main" form.
public static string folderToUpdate(string folderChanged)
{
// Main m = new Main();
string folder1 = foldersToSync[0];
string folder2 = foldersToSync[1];
string folderToUpdate;
// If the folder changed is folder1 then the folder to update must be folder2.
// If the folder changed is folder2 then the folder to update must be folder1.
if (folderChanged == folder1)
{
folderToUpdate = folder2;
}
else
{
folderToUpdate = folder1;
}
return folderToUpdate;
}
非常感谢那些帮助过我的人。