我需要在记事本中写入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));
处理了最后一个元素。
我该如何解决这个问题?
更新:
我通过更改以下行找到了答案
progressBar1.Maximum = listeksnya.Count-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)