收录日期:2019/04/18 21:07:13 时间:2010-06-22 20:47:03 标签:c#,winforms,listview

I have so many issues with my project, i really don't know where to begin. First off, i get an error "an object reference is required for non-static field, method or property". It underlines retPath (the line: DriveRecursion_results.DriveRecursion(retPath);). I have no idea how to fix this.

THe other thing i'm still stumped on is how to populate a listview on my Windows Form. What i want is a list of files that need to be renamed (versus a list of all files in my list.)

Can anybody help? I have been struggling miserably with this for several hours now.

Here is my code:

Form1.cs:

namespace FileMigration
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        FolderSelect("Please select:");
    }
    public string FolderSelect(string txtPrompt)
    {
        //Value to be returned
        string result = string.Empty;

        //Now, we want to use the path information to population our folder selection initial location
        string initialCheckoutPathDir = (@"C:\");
        System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(initialCheckoutPathDir);
        FolderBrowserDialog FolderSelect = new FolderBrowserDialog();
        FolderSelect.SelectedPath = info.FullName;
        FolderSelect.Description = txtPrompt;
        FolderSelect.ShowNewFolderButton = true;

        if (FolderSelect.ShowDialog() == DialogResult.OK)
        {
            string retPath = FolderSelect.SelectedPath;
            if (retPath == null)
            {
                retPath = "";
              }
            DriveRecursion_Results ds = new DriveRecursion_Results();
           ds(retPath);
            result = retPath;
            //Close this form.

        } 
        return result;
    }



   }
}

Here is DriveRecursion_Results.cs:

namespace FileMigration
{
public partial class DriveRecursion_Results : Form
{
    public DriveRecursion_Results()
    {
        InitializeComponent();
    }

    private void fileOutput_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    public void DriveRecursion(string retPath)
    {

       // string[] files = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories);

        string pattern = " *[\\~#%&*{}/<>?|\"-]+ *";
        string replacement = "";
        Regex regEx = new Regex(pattern);

        string[] fileDrive = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories);
        List<string> filePath = new List<string>();

        foreach (string fileNames in fileDrive)
        {
            if (regEx.IsMatch(fileNames))
            {
                filePath.Add(fileNames);
                //I tried adding my listview (fileOptions) here but I cannot for some reason
            }
        }

        }





        }




    }

ANY help would really be appreciated :( Does anybody have any ideas on how to change my code so it actually works?

You are not able to add items to your list view because you are trying to add them from a static method.

Since it is static there is no ListView because there isn't actually a Form to add things to. You will need to make DriveRecursion() not static in order to add things to the ListView.

Additionally, when you make DriveRecursion() not static, you will need a way to let Form1 know which DriveRecursion_Results class to populate.

Another approach you could take is having Form1 return retPath to DriveRecursion_Results.

Edit

Removed irrelevant parts of my original answer

I have copied your code exactly how you posted it. And then made the following changes to FolderSelect() in Form1.cs When I run this code. I can get the second window to pop up, but not the other window to close, because that will cause the application to quit.

Please make sure you have ds.Show() and do at some point call ds.DriveRecursion(retPath)

Modified FolderSelect(string) in Form1.cs:

    private void FolderSelect( string txtPrompt )
    {
        //Value to be returned
        string result = string.Empty;

        //Now, we want to use the path information to population our folder selection initial location
        string initialCheckoutPathDir = ( "C:\\" );
        System.IO.DirectoryInfo info = new System.IO.DirectoryInfo( initialCheckoutPathDir );
        FolderBrowserDialog FolderSelect = new FolderBrowserDialog();
        FolderSelect.SelectedPath = info.FullName;
        FolderSelect.Description = txtPrompt;
        FolderSelect.ShowNewFolderButton = true;

        if( FolderSelect.ShowDialog() == DialogResult.OK )
        {
            string retPath = FolderSelect.SelectedPath;
            if( retPath == null )
            {
                retPath = "";
            }
            DriveRecursion_Results ds = new DriveRecursion_Results();
            ds.DriveRecursion( retPath );
            ds.Show();
            result = retPath;
            //Close this form.

        }
        return;
    }

Issue 1: your function is static. If it stops being such, this will work. This is because a static function does not have this hidden 'this' argument - the reference to object it acts upon. So, it can only access static data members, not regular ones.

You can't add the items to your listview from that level because the listview is non-static and the method DriveRecursion is static. I would start by changing the DriveRecursion method to be non-static or return a list of file paths.