填充ListView被视为空?

时间:2014-05-09 00:00:56

标签: c# .net

我有一个肯定填充的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"。

一些澄清:我在发布之前已经广泛搜索了。没有其他问题是完全重复的。有许多类似的问题,但解决方案总是被证明是一个列表问题或一个"一个一个错误"这些都不是问题我&#39我有。我再次强调 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;
    }

非常感谢所有帮助过我的人。

3 个答案:

答案 0 :(得分:3)

是的,您的问题在于m = new Main()部分。您需要以某种方式获取对表单的引用,而不是创建新表单。

要获取表单上的选定文件夹,最佳做法是在表单上创建属性。

答案 1 :(得分:1)

因为它是静态的,您需要将对表单/窗口或控件的引用传递给方法。

我考虑重写该方法,以便您不必将引用传递给任何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);

答案 2 :(得分:0)

我通过使用包含&#34; lstFoldersToSync&#34;的内容的静态字段列表解决了这个问题。控制,然后访问它(而不是试图直接访问控件的内容)。

新工作代码:

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;
}

非常感谢所有帮助过我的人。