2009-09-03 32 views
0

私は以下の入れ子構造を持っています。私が必要とするのは、RadioButtonList選択の値に基づいて、CustomControl1コードの中からDB Linqクエリをフィルタリングすることです。ネストされたインナーコントロールからアウターコントロールを見つける方法

x MainPage1 
x---- Panel1 (modal popup) 
x--------- UpdatePanel (upMailOrStatusAction, on Panel1) 
x-------------- RadioButtonList (rblActionLevel, on UpdatePanel) 
x-------------- SubForm1 (on Panel1) 
x------------------- CustomControl1 (on Subform1) 
x------------------------ DropDownList (on CustomControl1) 

私がコントロールを見つけるために、次のような何かをしようとしていますが、それは「名前が 『upMailOrStatusAction』は現在のコンテキスト内に存在しないと言う。

RadioButtonList rbl = upMailOrStatusAction.FindControl("rblActionLevel") as RadioButtonList; 

見つけるための最善の方法は何ですかRadioButtonListコントロールはい、私はこれでかなり新しいです

は、スワニー、GA

で ジムをありがとう[OK]を、ここではポップアップASPXはあります?!:

  <asp:Panel ID="pnlAddMailOrStatusAction" runat="server" CssClass="modalPopupLarge" Style="display: none;"> 
      <asp:UpdatePanel ID="upMailOrStatusAction" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false" RenderMode="Block"> 
       <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="rblActionType" /> 
       </Triggers> 
       <ContentTemplate> 
        <div class="borderDiv"> 
         <table class="borderTable0" cellpadding="0" cellspacing="0" width="100%"> 
          <thead> 
           <tr align="left"> 
            <th colspan="9">Action Detail</th> 
           </tr> 
          </thead> 
          <tbody> 
           <tr> 
            <td colspan="1"> 
             <label class="labelfield">Action Level:</label> 
            </td> 
            <td colspan="1" rowspan="1" align="left"> 
             <asp:RadioButtonList ID="rblActionLevel" runat="server" AutoPostBack="True" RepeatDirection="Horizontal" 
              RepeatLayout="Flow"> 
              <asp:ListItem Selected="True" Value="Base" Text="Base&nbsp;&nbsp;" /> 
              <asp:ListItem Value="Coverage" Text="Coverage" /> 
             </asp:RadioButtonList> 
            </td> 
            <td colspan="1" align="left"> 
             <asp:Label ID="lblMSCoverage" runat="server" class="labelfield" Text="Coverage:" /> 
            </td> 
            <td colspan="1" align="left"> 
             <asp:Label ID="txtMSCoverage" runat="server" /> 
            </td> 
            <td colspan="5"> 
             &nbsp; 
            </td> 
           </tr> 
           <tr> 
            <td colspan="9"> 
             <hr /> 
            </td> 
           </tr> 
           <tr> 
            <td colspan="9"> 
            <st:MailAddSubform runat="server" ID="mailAddSubform" /> 
            <st:StatusActionAddSubform runat="server" ID="statusActionAddSubform" Visible="false" /> 
            </td> 
           </tr> 
           <tr> 
            <td colspan="9"> 
             <hr /> 
            </td> 
           </tr> 
          </tbody>  
         </table> 
        </div> 
       </ContentTemplate> 
      </asp:UpdatePanel> 
     </asp:Panel> 

そしてここで、サブフォームのASPXです:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MailAddSubform.ascx.cs" 
Inherits="Company.Solutions.Web.Controls.MailAddSubform" %> 
処置: がMessage: : そしてここでは、カスタムコントロールのaspxですフィルタ

そして最後に、ここではカスタムコントロールの背後にあるコードです。ラジオボタンリストを参照する場所のStackOverflowを探します。

using System; 
using System.Collections.Generic; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 
using Company.Solutions.Data; 
using Company.Solutions.Data.Model; 
using Company.Solutions.Business.ViewModels; 
using Company.Solutions.Business.Helpers; 


namespace Comapny.Solutions.Web.Controls 
{ 
    public partial class StMailActionLookup : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      BindForm(); 
     } 

     protected void BindForm() 
     { 
      IEnumerable actions = GetClaimMailActions(GetFilter()); 
      ddlLookup.DataSource = actions; 
      ddlLookup.DataTextField = "CodeAndDescription"; 
      ddlLookup.DataValueField = "actionCd"; 
      ddlLookup.DataBind(); 
     } 

     //protected void ddlLookup_DataBound1(object sender, System.EventArgs e) 
     //{ 
     // ddlLookup.Items.Insert(0, new ListItem("<Please Choose an Action>", String.Empty)); 
     //} 

     private MailActionFilters GetFilter() 
     { 
      MailActionFilters filters = new MailActionFilters(); 
      if (chkForms.Checked) 
        filters |= MailActionFilters.Forms; 
      if (chkRequested.Checked) 
        filters |= MailActionFilters.RequestedInfo; 
      if (chkOther.Checked) 
        filters |= MailActionFilters.Other; 

      return filters; 
     } 

     public IEnumerable GetClaimMailActions(MailActionFilters filter) 
     { 
      RelationalDataContext db = RelationalDataContext.Create(); 
      List<Expression<Func<ClaimMailAction, bool>>> predicates = new List<Expression<Func<ClaimMailAction, bool>>>(); 

      const string MAIL_ACTIONS = "0"; 
      const char FORMS = 'F'; 
      const char REQUESTED_INFO = 'R'; 
      const char EXCLUDE = 'X'; 



      //StackOverflow help 

      //RadioButtonList rbl = (RadioButtonList) Control.Parent.FindControl("rblActionLevel"); 




      if ((!chkForms.Checked && !chkRequested.Checked && !chkOther.Checked) | (chkForms.Checked && chkRequested.Checked && chkOther.Checked)) 
      { 
       predicates.Add(cma => cma.ActionCd.StartsWith(MAIL_ACTIONS) && (cma.EsolutionsCode == null || cma.EsolutionsCode!= EXCLUDE)); 
      } else { 

       if((filter & MailActionFilters.Forms) == MailActionFilters.Forms) 
        predicates.Add(cma => cma.ActionCd.StartsWith(MAIL_ACTIONS) && cma.EsolutionsCode == FORMS); 

       if((filter & MailActionFilters.RequestedInfo) == MailActionFilters.RequestedInfo) 
        predicates.Add(cma => cma.ActionCd.StartsWith(MAIL_ACTIONS) && cma.EsolutionsCode == REQUESTED_INFO); 

       if((filter & MailActionFilters.Other) == MailActionFilters.Other) 
        predicates.Add(cma => cma.ActionCd.StartsWith(MAIL_ACTIONS) && (cma.EsolutionsCode == null || (cma.EsolutionsCode != EXCLUDE && cma.EsolutionsCode != FORMS && cma.EsolutionsCode != REQUESTED_INFO))); 
      } 

      var predicate = PredicateBuilder.Make<ClaimMailAction>(); 
      predicates.ForEach(delegate(Expression<Func<ClaimMailAction, bool>> expr) 
      { 
       predicate = predicate.Or(expr); 
      }); 

      var qry = db.ClaimMailActions.Where(predicate).Select(c => new { c.ActionCd, CodeAndDescription = string.Format("{0} - {1}", c.ActionCd, c.ActionDesc) }); 

      return qry.ToList(); 
     } 
    } 
} 

新しいコードリスト。私の同僚はこれを別のルックアップに使用しました。誰かが私にこのルックアップのために何か類似のことをする方法を教えてもらえますか?たとえ非効率的であっても、それがそうであればそれである。

HtmlForm form; 



     foreach(var ctl in Page.Controls[0].Controls) 

     { 

      if(ctl is HtmlForm) 

      { 

       form = ctl as HtmlForm; 

       ContentPlaceHolder holder = form.FindControl("DefaultContent") as ContentPlaceHolder; 

       if (holder != null) 

       { 

        PlaceHolder paymentControlHolder = holder.FindControl("plcPaymentForm") as PlaceHolder; 

        if (paymentControlHolder != null) 

        { 

         IListener listener; 

         foreach (var c in paymentControlHolder.Controls) 

         { 

          if (c is IListener) 

          { 

           listener = c as IListener; 

           rblPaymentType.SelectedIndexChanged += listener.AddHandler(); 

          } 

         } 

        } 

       } 





      } 

     } 

[OK]を、私はこれをしようとしていますが、非常にラジオボタンの選択された値を決定する方法をまだ考え出したていない:

HtmlForm form; 
     foreach (var ctl in Page.Controls[0].Controls) { 
      if (ctl is HtmlForm) { 
       form = ctl as HtmlForm; 
       ContentPlaceHolder holder = form.FindControl("DefaultContent") as ContentPlaceHolder; 
       if (holder != null) { 
        RadioButtonList rblControlHolder = holder.FindControl("rblActionLevel") as RadioButtonList; 
        if (rblControlHolder != null) { 

        } 
       } 
      } 
     } 

答えて

2

私はあなたが達成しようとしている私は完全に理解するかどうかはわからないかもしれません。しかし、ページ上のコントロールを見つけたい場合は、hereと投稿したソリューションが必要な場合があります。

public static Control FindControlRecursive(Control parent, string controlId) 
{ 
    if (controlId == parent.ID) 
     return parent; 

    foreach (Control ctrl in parent.Controls) 
    { 
     Control tmp = FindControlRecursive(ctrl, controlId); 
     if (tmp != null) 
      return tmp; 
    } 

    return null; 
} 

これは標準のfindコントロールの再帰的な実装です。しかし、あなたの親を賢く選んでください。大きなページがあり、それを検索ルートと指定すると、ページのすべてのコントロールを最も深いネストされたコントロールまでトラバースします。基本的にあなたのコントロールから始まり、ページレベルに達するまで再帰的に上がることもできます。別のオプションかもしれない。

この再帰的な検索で見つかった唯一の問題は、ページにリピーターがあるときに問題が発生する可能性があることです。リピータの内部コントロールを走査しないでください。そのアーキテクチャのために、そうでなければviewstateを緩めるいくつかの問題があります。いったん時間がついたら、この再帰的メソッドの更新を投稿します。

編集:次のように、ラジオボタンの選択されたエントリを取得

RadioButtonList myInstance = //find my radio button list 
string selectedValue = myInstance.SelectedValue; 
+0

Juri、 目的はラジオボタンの値を決定することです。その結果、ドロップダウンリストを適切に満たすようにクエリを変更できます。私はあなたのルックアップを試みるだけでなく、それが便利になるかもしれません。 ありがとう! ジム – James

+0

あなたのラジオボタンリストがあなたのユーザーコントロールまたはページにある場合は、直接アクセスする必要がありますか?少なくともそれはコンテナ要素です。私は本当になぜあなたのページからすべてを横断しなければならないのか分からない。 – Juri

+0

Btw、以下のコードは、私のFindControlRecursive(this.Page、 "rblActionLevel")をRadioButtonListとして呼び出すことで解決できますが、私はまだ簡単な方法があると確信しています。 – Juri

0

は、制御あなたの方法を作るためにプロパティParentを使用します木。カオスにピギーバック

CustomControl1.Parent.Parent.Parent.FindControl("rblActionLevel"); 
+0

[OK]をみんな、私がアイデアを得るが、私はこのように定義されたカスタムコントロールの背後にあるコードでいます: パブリック部分クラスStMailActionLookup:System.Web.UI.UserControl "静的ではないフィールド、メソッド、またはプロパティ 'System.Web.UI.Control.Parent.Get'にオブジェクト参照が必要です RadioButtonList rbl =(RadioButtonList)StMailActionLookup.Parent.FindControl( "rblActionLevel"); – James

+0

カスタムコントロールをサブフォーム内で定義する方法は次のとおりです。

James

+0

構造を分析できるようにフォーム全体を投稿してみませんか? – ChaosPandion

0

...

RadioButtonList rbl = (RadioButtonList)Control.Parent.FindControl("rblActionLevel") 
0

「がオブジェクト参照が非静的フィールド、メソッド、またはプロパティ「System.Web.UI.Control.Parentために必要とされます。以下の使用」を取得:RadioButtonListののRBL =(RadioButtonListの)StMailActionLookup.Parent.FindControl( "rblActionLevel");

は、あなたが参照すべきオブジェクトタイプ "StMailActionLookup" を参照「をメールActionLookup "は、コントロールのインスタンスのIDです。

だからコードは次のようになります。

RadioButtonList rbl = (RadioButtonList) mailActionLookup.Parent.FindControl("rblActionLevel"); 

ないそれはあなたがしかし、思い付いたコード、ほんの少しの修正で問題だか確認します。

また、UpdatePanelはテンプレートコントロールであり、RadioButtonListと他のすべてのコントロールは、UpdatePanelsのライフサイクルのどこかにあるContentTemplateContainerの内部でレンダリングされます(これはCreateChildControlsのどこかにあると思います)。 BindForm()メソッドがどこから呼び出されたかによって異なりますが、RadioButtonListが見つかった時点ではまだ使用できない可能性があります。マークアップ内のコントロールでも、テンプレート内のコントロールはマークアップ内の他のコントロールと同じ方法で作成されません。彼らは変な獣だ。

テストの場合は、オーバーライドされたレンダリングメソッドなどでfindコントロールコードを実行してみてください。 Renderメソッドを使用すると、すべてのコントロールを使用できることが保証されます。 upMailOrStatusActionはUpdatePanelのであるから

public override Render(HtmlTextWriter writer) { 
    RadioButtonList rbl = (RadioButtonList)upMailOrStatusAction.FindControl("rblActionLevel"); 
} 

また、コードが

upMailOrStatusAction.ContentTemplateContainer.FindControl("rblActionLevel"); 
+0

最初のコード例 "mailActionLookup"と2番目の例 "upMailOrStatusAction"の両方で、ここに引用符で囲まれたフィールドを参照する各エラーで "名前が現在のコンテキストに存在しません"というエラーが表示されます。私はまだレンダリングを試していないが、私はそうするだろう。ありがとう、 ジム – James

+0

はい、申し訳ありませんが、私はより密接にコードを読んだはずです。 MailActionLookupはRadioButtonListの兄弟です(完全に逃してしまった)ので、非脆いコードを書くのは難しいです。あなたの最善の策は、ページを開始して、ラジオボタンリストの階層を再帰的に検索することです。 Page.FindControlは1つのレベルの深さしかないので、トリックは行いません。あなたはウェブ上でヘルパーメソッドを見つける必要があります。 または、mailActionControlから始まるヘルパーメソッドを右クリックして、各親コントロールのコントロールのコレクションを検索する階層を上に移動できます。どちらもかなり非効率的です。 – JayRu

+0

ラジオボタンの選択に基づいてセッション変数を設定し、その値をここで読み取ることができるのだろうか?簡単な方法があるはずです!ありがとう、 ジム – James

0

[OK]を、最終的には皆のために、この作業のおかげです。正しい方向に私を助けてくれてありがとう、JayRuに感謝します。ここで私は使用していますものです(それはまだそれをフックする仕事のビットを必要とする):

HtmlForm form; 
     foreach (var ctl in Page.Controls[0].Controls) { 
      if (ctl is HtmlForm) { 
       form = ctl as HtmlForm; 
       ContentPlaceHolder holder = form.FindControl("DefaultContent") as ContentPlaceHolder; 
       if (holder != null) { 
        RadioButtonList rblControlHolder = holder.FindControl("rblActionLevel") as RadioButtonList; 
        if (rblControlHolder != null) { 
         if (rblControlHolder.SelectedValue == "Base") { 

         } 
        } 
       } 
      } 
     } 
+0

JayRuが解決策を見つける手助けをするなら、彼の答えを受け入れるべきでしょう。または少なくとも彼に投票してください(あなたが投票するのに十分な議員を持っていると仮定すれば...分かりません) –

関連する問題