非静态字段错误需要对象引用

时间:2014-03-27 18:05:19

标签: c#

我有一个很长的方法,最终返回一个DataTable。该方法打开如下:

    public DataTable ImportCsvData(string folderPath, string[] csvFileNames, int compIdValue)
    {
        int countDupFiles = 0;// Count number of previously imported csv files
        int countImportedFiles = 0;// Count imported files

        for (int i = 0; i < csvFileNames.Length; i++)
        {
            frmImportCsvData.importProgressBar(i);

此方法位于我正在执行所有SQL请求的类中,但是从另一个控制我的Form的类调用。上面的最后一行代码在我的Form类中调用一个方法,该类应该更新我的进度条。该方法的代码是:

public void importProgressBar(int i)
        {
            progressTableLayoutPanel.Visible = true;//display progress bar

            int percProgress = 100 * (i + 1) / csvFileNames.Length;

            while (percProgress < 100)
            {
                if (percProgress <= 99)// Required to prevent values above 100 that crash the code
                    progressBar.Value = percProgress + 1;//hack that makes the progress bar update when progress value decreases
                progressBar.Value = percProgress;
                percProgressLabel.Text = percProgress.ToString();

                progressTableLayoutPanel.Update();//Required to display all progress bar table contents
                //Thread.Sleep(200);
            }
            progressTableLayoutPanel.Visible = false;
        }

这给了我错误:非静态字段,方法或属性'BetfairDatabaseMDI.frmImportCsvData.importProgressBar(int)'需要对象引用。如果我将importProgressBar方法设置为static,我会得到一堆其他类似的错误。有人可以告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

frmImportCsvData是一个类,所以是类型,它是一个抽象的东西,而不是内存中的真实对象。错误消息表明您需要一个类型的实例,因此具体的,现有的东西,在给定类型的内存中的对象。

因此,基本上,您需要将frmImportCsvData实例传递给ImportCsvData。例如,像这样:

public DataTable ImportCsvData(frmImportCsvData myForm, …)
{
    myForm.importProgressBar(i);
}

然后从frmImportCsvData 中调用方法 ,您只需传入this,表示当前实例(在运行时意义上) )封闭类:

dataLayer.ImportCsvData(this, …);

对于您正在使用的特定UI框架(无论是WinForms,WPF,还是其他),最简单并不意味着最佳或正确。 在您遇到任何更复杂的构造之前,您必须先了解类型 first 类型和实例之间的差异。所以,抓住一本C#书,回到基础知识,这将对你有所帮助。


注意:使用大写字母开始方法,类和属性的标识符是一种常见的约定。