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
的最大值,我想 progressbar
在 MessageBox.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)
我需要在记事本中写入 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;
问题出在 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)