0

Web ページにパネルのプロファイル リストがあります。アイテムのリストに行が含まれているように、複数の小さなパネルが含まれています。ここの項目はプロファイルです。各プロファイルは実際には小さなパネルのSingleProfileで、チェックボックスが内側にあります。チェックボックスは、同じアイテムを見つけるために使用されるIDを持っているため、ここではコアです。

このページには、別の同様の大きなパネルもあります。最初のパネルには存在しない項目のみを 2 番目のパネルに追加する必要があります。したがって、タスクは、最初のパネルに表示されていないプロファイルのみを 2 番目のパネルに表示することです。これは、両方のリストのチェックボックスのIDを使用してチェックされます。

2 番目のパネルで新しく追加されたプロファイルが最初のパネルに既に存在するかどうかを確認するために、 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
        }
    }
}

「バグ #1」と記された行で例外「System.ArgumentOutOfRangeException」が発生します。

ストアド プロシージャから ID を取得する sqlReader を使用します。ストアド プロシージャは、SQL Server で正常に動作します。しかし、sqlReader の値を Web ページのラベルに出力すると (コードのコメントを参照)、「1 1 2 2 3 3 4 4 5 5」のように各値が 2 倍になります。

4

2 に答える 2

0

Bug#1については、'Controls[i]' の下にネストされたコントロールが存在しない可能性があります。したがって、バグを防ぐために、まず現在の要素の下にネストされたコントロールがあるかどうかを確認し、次に型キャストの前にコントロールの型を確認します。

    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の場合、「各値が 2 倍になる」とは正確にはどういう意味ですか? ループ内で同じラベル (ID: Label1) に追加していることがわかります。そのため、反復ごとにテキストが連結される可能性があります。また、親パネルのネストされたコントロール内で同じラベルのテキストまたはラベルを操作する必要があるかどうか、要件に従ってください。

于 2013-06-19T10:13:54.960 に答える