我收到错误未处理的类型' System.ArgumentOutOfRangeException'发生在RCPYC Membership Program.exe附加信息:索引超出范围。必须是非负数且小于集合的大小。在以下代码中。
private void ApplyBtn_Click(object sender, EventArgs e)
{
int index = 0;
bool loop = true;
string text;
List<string> Data = new List<string>();
while (loop == true)
{
if (index == 17) //If statment takes a boolean value and sets it to the correct radio button
{
if (BtOwnerRdio.Checked == true)
{ Data[index] = "true";}
else if(SocialRdio.Checked == true)
{
Data[index] = "false";
}
}
else //Else statement finds the correct textbox and sets the data to its text value
{
if (index < 10)
{ text = "tb0" + index.ToString(); }
else
{ text = "tb" + index.ToString(); }
Control tb = Controls.Find(text, true).FirstOrDefault() as Control; //Finds control with the name of the text string
if (index != 0) //Does not encrypt the ID value
{
try
{
MessageBox.Show("Try");
Data[index] = P.encrypt(tb.Text); //Sets the list value to the textbox text value
//This is the line that causes the error
}
catch (Exception)
{
MessageBox.Show("Fail");
throw; **Error is thrown here**
}
}
}
index = index + 1; //Adds 1 to the index to move to the next loop
if (index == Data.Count - 1) //***
{ loop = false; } //Ends the loop if the Data list is filled
}
代码从文本框( tb )获取文本值并将其添加到列表(数据),但在返回空白值时返回错误。 我已经检查 P.encrypt 方法在返回空白值时完成,并且在将字符串添加到列表时发生错误。调用列表时的索引是1,我尝试手动将列表容量设置为30,但是我仍然得到错误。
我对错误的理解是索引太高或者是负数,但是如果我手动将列表容量设置为30,那么1怎么可能太高或者负数?
答案 0 :(得分:2)
此代码中有两个未命中用法。
更改Data[index] = P.encrypt(tb.Text);
Data.Add(P.encrypt(tb.Text));
答案 1 :(得分:2)
我认为你对列表的容量有些疑惑。对于List<T>
,[Capacity][1]
只是列表在需要调整其内部数据结构之前可以容纳的元素数。重要的是,这并不意味着列表具有 30个条目,这意味着虽然列表的大小小于30,但不需要进行任何大小调整。首次创建时,它仍将以0个条目开始。
我认为你还没有把任何东西放到列表中,所以Data[1]
确实会超出范围。如果你想要30个初始化的插槽,那么你需要添加30个项目来初始化你的列表,或者使用类似于数组的东西,如果你把它的大小设置为30就会有30个项目。