2011-09-26 6 views
2

で取得する方法は、DetalsViewのすべての子コントロールの名前がString型のListを作成するメソッドを作成しようとしています。コントロールのすべての子コントロールのリッツをタイプ

私が得た最も近いました:

  foreach (Control c in dv.Controls) 
      { 
       if (c is Label) 
       { 
        controlsToCheck.Add(c.ID); 
       } 
      } 

      foreach (string s in controlsToCheck) 
      { 
       Label lbl = (Label)dv.FindControl(s); 
       if (lbl.Text == "") 
       { 
        lbl.Text = "None"; 
        lbl.CssClass = "bold"; 
       } 
      } 

しかし、このすべてはありません(。すなわちdv.Controlsは一つだけのアイテムを返します)最初のforeachに一度反復して終了です。私はFindControlを使用する場合、私は項目に得ることができますが、それは私が各項目のためにそれを行う必要があることを意味します。

任意の強打?

ありがとうございます!

編集:

 <asp:DetailsView DefaultMode="ReadOnly" FieldHeaderStyle-CssClass="dwHeader" CssClass="marginLeftRightBottom10px" 
      AutoGenerateDeleteButton="true" AutoGenerateEditButton="true" GridLines="None" 
      ID="dvIndividualItem" runat="server" AutoGenerateRows="False" DataSourceID="sqldsSingleItem" 
      OnDataBound="dvIndividualItem_DataBound"> 
      <Fields> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item Name:</h1> 
         <p> 
          The name of the item.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label runat="server" ID="lblItemName" Text='<%# Bind("itemName") %>'></asp:Label> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox runat="server" ID="tbItemName"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item Description:</h1> 
         <p> 
          The description of the item.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label runat="server" ID="lblItemDescription" Text='<%# Bind("itemDescription") %>'></asp:Label> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox runat="server" ID="tbItemDescription"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item Image:</h1> 
         <p> 
          The image of the item.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Image runat="server" ID="imgItem" Width="40px" Height="40px" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox ReadOnly="true" runat="server" ID="tbItemImage"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item Type:</h1> 
         <p> 
          Specifies the item type.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblItemType" Text='<%# Eval("itemType") %>' runat="server" /> 
        </ItemTemplate> 
        <%--       <InsertItemTemplate> 
         <asp:DropDownList AutoPostBack="true" OnSelectedIndexChanged="ddlItemTypes_SelectedIndexChanged" 
          DataTextField="itemType" DataValueField="typeId" DataSourceID="sqldsTier1Category" 
          ID="ddlItemTypes" runat="server"> 
         </asp:DropDownList> 
         <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:myDbConnection%>" ID="sqldsTier1Category" 
          runat="server" SelectCommand="dbo.getItemCategories" SelectCommandType="StoredProcedure"> 
         </asp:SqlDataSource> 
        </InsertItemTemplate>--%> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item SubType:</h1> 
         <p> 
          Specifies the sub-item type.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblSubItemType" Text='<%# Eval("itemSubType") %>' runat="server" /> 
        </ItemTemplate> 
        <%--       <InsertItemTemplate> 
         <asp:DropDownList OnDataBound="ddlItemSubTypes_OnDataBound" AutoPostBack="true" DataTextField="itemSubType" 
          DataValueField="subTypeId" DataSourceID="sqldsTier2Category" ID="ddlItemSubTypes" 
          runat="server"> 
         </asp:DropDownList> 
         <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:myDbConnection%>" ID="sqldsTier2Category" 
          runat="server" SelectCommand="dbo.getItemSubCategories" SelectCommandType="StoredProcedure"> 
          <SelectParameters> 
           <asp:ControlParameter ControlID="dwNewItem$ddlItemTypes" Name="typeId" PropertyName="SelectedValue" 
            DbType="Int16" /> 
          </SelectParameters> 
         </asp:SqlDataSource> 
        </InsertItemTemplate>--%> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Item SubSubType:</h1> 
         <p> 
          Specifies the sub-sub-item type.</p> 
         <p> 
          <i>Not always applicable.</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblSubSubItemType" Text='<%# Eval("itemSubSubType") %>' runat="server" /> 
        </ItemTemplate> 
        <%--       <InsertItemTemplate> 
         <asp:DropDownList DataTextField="itemSubSubType" DataValueField="subSubTypeId" DataSourceID="sqldsTier3Category" 
          ID="ddlItemSubSubTypes" runat="server"> 
         </asp:DropDownList> 
         <asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:myDbConnection%>" ID="sqldsTier3Category" 
          runat="server" SelectCommand="dbo.getItemSubSubCategories" SelectCommandType="StoredProcedure"> 
          <SelectParameters> 
           <asp:ControlParameter ControlID="dwNewItem$ddlItemSubTypes" Name="subTypeId" PropertyName="SelectedValue" 
            DbType="Int16" /> 
          </SelectParameters> 
         </asp:SqlDataSource> 
        </InsertItemTemplate>--%> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Requires Sword Swinger Class?</h1> 
         <p> 
          Specifies whether the item can only be used by the Sword Swinger.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:CheckBox ID="cbReqSwordSwinger" Text='<%# Bind("requiresSwordSwinger") %>' runat="server" /> 
        </ItemTemplate> 
        <%--       <InsertItemTemplate> 
         <asp:CheckBox runat="server" ID="cbReqSwordSwinder" /> 
        </InsertItemTemplate>--%> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Requires Rat Catcher Class?</h1> 
         <p> 
          Specifies whether the item can only be used by the Rat Catcher.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:CheckBox ID="cbReqRatCatcher" Text='<%# Bind("requiresRatCatcher") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:CheckBox runat="server" ID="cbReqRatCatcher" /> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <HeaderTemplate> 
         <h1> 
          Requires Spell Mumbler Class?</h1> 
         <p> 
          Specifies whether the item can only be used by the Spell Mumbler.</p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:CheckBox ID="cbReqSpellMumbler" Text='<%# Bind("requiresSpellMumbler") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:CheckBox runat="server" ID="cbReqSpellMumbler" /> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Strength permanently added:</h1> 
         <p> 
          Specifies the amount of strength the item permanently adds to your character.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblPermanentStrength" Text='<%# Bind("permanentStrength") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemPermanentStr"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Agility permanently added:</h1> 
         <p> 
          Specifies the amount of agility the item permanently adds to your character.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblPermanentAgility" Text='<%# Bind("permanentAgility") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemPermanentAgl"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Magical Power permanently added:</h1> 
         <p> 
          Specifies the amount of magical power the item permanently adds to your character.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblPermanentMagicalPower" Text='<%# Bind("permanentMagicalPower") %>' 
          runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemPermanentMP"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Health Points restored:</h1> 
         <p> 
          Specifies the amount of health points the item restores.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblHPRestored" Text='<%# Bind("restoresHealthPoints") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemRestoresHp"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Mana Points restored:</h1> 
         <p> 
          Specifies the amount of mana points the item restores.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblManaRestored" Text='<%# Bind("restoresMana") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemRestoresMana"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderStyle-CssClass="colorBlue dwHeader"> 
        <HeaderTemplate> 
         <h1> 
          Health Points permanently added:</h1> 
         <p> 
          Specifies the amount of health points the item permanently adds to your character.</p> 
         <p> 
          <i>Only available when the item is set to type "Consumable"</i></p> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <asp:Label ID="lblPermanentHP" Text='<%# Bind("permanentHealth") %>' runat="server" /> 
        </ItemTemplate> 
        <InsertItemTemplate> 
         <asp:TextBox Enabled="false" runat="server" ID="tbItemPermanentHP"></asp:TextBox> 
        </InsertItemTemplate> 
       </asp:TemplateField> 
      </Fields> 
     </asp:DetailsView> 

答えて

7

この

public static IEnumerable<Control> GetAllControls(Control parent) 
    { 
     foreach (Control control in parent.Controls) 
     { 
      yield return control; 
      foreach (Control descendant in GetAllControls(control)) 
      { 
       yield return descendant; 
      } 
     } 
    } 

を試してみて、

を呼び出します。ここに私たDetailsViewです(私はそれがページに収まるように、ちょうどより多くのコントロールをどこにどの、いくつかのことを切り出します)
List<Control> ControlsToCheck = GetAllControls(dv).OfType<Label>().ToList(); 
+0

ええと...あなたの音はちょっと複雑すぎます。 Ivはこれらのキーワードを使用したことはありません。私はなぜ私のdoesntの仕事をしてください説明することができますか? – TheGateKeeper

+0

@ TheGateKeeper DetailsViewのコントロールは、1つのレベルではありません。彼らは入れ子になっています。すべてのコントロールを取得するには、子コントロールを持たない単純なコントロールを取得するまで再帰関数を使用する必要があります。 –

+0

ああ、私は今理解しています。あなたの方法は2レベルだけ繰り返すことはありませんか? – TheGateKeeper

1

dv.Controlsを反復処理しているとき、最初のレベルのundeあなたのDetalsViewを見てください。すべてのラベルを見つける必要がある場合は、すべての子コントロールと子どもなどを反復処理する必要があります。

@Bala Rによる回答は、これの素晴らしい例です。 this answerにもいくつかの例があります。

+0

Hmmmm、テンプレートに直接コントロールを追加すると、それはdetailsViewによって直接含まれることはありませんか?説明してください ああ、私は理解していると思う、Divタグはコントロールがあまりにも正しいのでカウント?だからあなたはそれらもthrouを繰り返す必要があります。 – TheGateKeeper

+0

@TheGateKeeper No. DetailsViewは、テーブルコントロールを作成します。テーブルコントロールは、テーブルセルを含む行のコレクションを取り込みます。テーブルセルは、最終的に探しているコントロールを含みます。このため、その中のコントロールをループしたい場合、再帰的に行う必要があります。 –

1

)私はバラRのソリューションを少し修正しました。このように使用

public static IEnumerable<T> GetControls<T>(this Control parent) where T : Control 
{ 
    foreach (Control control in parent.Controls) 
    { 
     if (control is T) yield return control as T; 
     foreach (Control descendant in GetControls<T>(control)) 
     { 
      if (control is T) 
       yield return descendant as T; 
     } 
    } 
} 

:私はそれだけであなたがそうあなたが第二段階として.OfType<T>を呼び出す必要はありませんに興味があるコントロールの種類をyeildsジェネリック拡張メソッド作ら

List<Label> labels = dv.GetControls<Label>().ToList(); 

または

foreach(Label label in dv.GetControls<Label>()) 
{ 
    //do stuff 
} 
+0

これは素晴らしい作品です。 – bgx

関連する問題