0

我在网页上有一个面板配置文件列表。它包含多个小面板,就像包含行的项目列表一样。这里的项目是配置文件。每个配置文件实际上是一个带有复选框的小面板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”。

4

2 回答 2

0

对于Bug#1,“Controls[i]”下可能没有嵌套控件。所以为了防止这个bug,你可以先检查当前元素下是否有嵌套控件,然后在类型转换之前检查控件的类型。

    if(ProfilesPanel1List.Controls[i].Controls.Count>1 && ProfilesPanel1List.Controls[i].Controls[1] is CheckBox) //Iff you are double sure about layout structure and assured that it is not going to 
//change. If changes are anticipated then again doing a foreach(..) over nested 'Controls' and type 
//checking is much better.
    {
     //Do the type conversion etc., as per your requirement.  
    }

对于Bug#2,“每个值都加倍”到底是什么意思?正如我所看到的,您在循环内附加到相同的标签(ID:Label1),因此每次迭代都有可能连接文本。另外,请确保根据您的要求,您是否需要在父面板的嵌套控件中操作相同标签的文本或标签。

于 2013-06-19T10:13:54.960 回答
0

BUG #1 的解决方案

在调试模式下从 quickwatch 中检查控件的数量及其名称,看看是ProfilesPanel1List.Controls[i]面板还是其他控件。在调试模式下检查后正确选择索引。而且您也不需要使用cbx1 = new CheckBox();代码行。它的下一行代码足以初始化该复选框。

您的sqlReader代码不足以获取第二个错误的实际原因。

于 2013-06-19T09:52:09.830 回答