我在网页上有一个面板配置文件列表。它包含多个小面板,就像包含行的项目列表一样。这里的项目是配置文件。每个配置文件实际上是一个带有复选框的小面板SingleProfile 。Checkbox是这里的核心,因为它有一个ID,用于查找相同的项目。
在这个页面上还有另一个类似的大面板。我应该只将那些不存在于第一个面板中的项目添加到第二个面板中。因此,任务是在第二个面板中仅显示第一个面板中未显示的那些配置文件。这是使用两个列表中复选框的ID进行检查的。
为了检查第二个面板中新添加的配置文件是否已经存在于第一个面板中,我尝试通过Controls[]属性访问第一个面板中每个项目的 ID属性。我在循环中这样做:
if (ProfilesPanel1.Controls.Count > 0)
{
for (int i = 0; i <= ProfilesPanel1List.Controls.Count - 1; i++)
{
//label1.Text += " "+Convert.ToString(sqlReader["chain_id"]); //Bug #2 - see Stored Procedure description
cbx1 = new CheckBox();
cbx1 = (CheckBox)ProfilesPanel1List.Controls[i].Controls[1]; //Bug #1 - here the Exception occurs
if (cbx1.ID == Convert.ToString(sqlReader["chain_id"])) //if profile already exists in the first panel
{
//Do not add this profile to the second panel
}
}
}
异常“System.ArgumentOutOfRangeException”出现在标有“Bug #1”的行中。
我使用 sqlReader 从存储过程中获取 ID。存储过程在 Sql Server 中运行良好。但是,当我将 sqlReader 的值输出到网页上的标签中时(参见代码中的注释),每个值都会加倍,例如“1 1 2 2 3 3 4 4 5 5”。