C# winform:进度条索引超出范围

C# winform : progress bar index was out of range

我需要在记事本中写入 27 行字符串。我的 progressbar1 用于计算正在处理的当前行

void WriteOutput(string dir, List<String>listeksnya)
    {
        string outputdirectory = Path.GetDirectoryName(textBox1.Text);
        string filename = Path.GetFileNameWithoutExtension(textBox1.Text);
        string filenameextension = Path.GetFileName(textBox1.Text);
        string newfilename = outputdirectory + "\[Pichernenko.web.id] Output - " + filenameextension;            
        progressBar1.Maximum = listeksnya.Count;

        //MessageBox.Show("minimum is "+progressBar1.Minimum.ToString()+" maximum is "+progressBar1.Maximum);
        try
        {
            streamwriternya = new StreamWriter(newfilename);

            for (int i = 0; i < progressBar1.Maximum+1; i++)
            {                    
                MessageBox.Show(listeksnya.ElementAt(i));
                progressBar1.Value = i; 
            }                
        }
        catch (Exception ex)
        {
            cmd.cetakGagal(ex.ToString());                                
        }            
    }

我不写记事本,因为我的progressbar有错误,它说index was out of range

我已经设置了 progressbar 的最大值,我想 progressbarMessageBox.Show(listeksnya.ElementAt(i)); 处理最后一个元素时完全填充。

我该如何解决这个问题?

更新:

我通过更改以下行找到了答案

progressBar1.Maximum = listeksnya.Count-1;

问题出在 for 循环的终止条件上:

for (int i = 0; i < progressBar1.Maximum+1; i++)

这使您访问列表的元素最多 progressBar1.Maximum(可能 100),而您只有 27 个元素并因此产生超出范围的错误。

另请注意,C# 索引从 0 开始,因此如果列表中有 10 项,则可以获取从索引 0 到索引 [=32= 的元素]9,而不是从索引 0 到索引 10(这使得它具有 11 元素而不是 10 )

 MessageBox.Show(listeksnya.ElementAt(i)); //will be error from i = 27 onwards

如果要显示与已处理的文件个数一样多的进度条,请尝试将值归一化:

for (int i = 0; i < progressBar1.Maximum+1; i++)
{                    
    MessageBox.Show(listeksnya.ElementAt(i));
    double val = (i + 1) * 100d / listeksnya.Count; //note the d to avoid 
    progressBar1.Value = (int)val; //this is correct now, cast to int if necessary
}                

请注意,您必须将循环终止设置为 listeksnya.Count 个元素,而不是遵循 progressBar1.Maximum:

for (int i = 0; i < listeksnya.Count; ++i)