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

时间:2016-04-14 16:00:55

标签: c# winforms list progress-bar

我需要在记事本中写入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的最大值,我希望progressbar完全填充,而MessageBox.Show(listeksnya.ElementAt(i));处理了最后一个元素。

我该如何解决这个问题?

enter image description here

更新:

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

progressBar1.Maximum = listeksnya.Count-1;

1 个答案:

答案 0 :(得分:1)

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

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

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

另请注意,C#索引从0开始,因此如果列表中有10项,则可以将索引0中的元素转换为索引 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)