2009-05-17 1 views
2

こんにちは、私はどのように動的にすべてのコントロール(およびそのID)をaspxページに取得するには?</p> <p>が可能なすべてのフィールドを持つページやリストボックスであります。

私に説明してみましょう...実行されようとしているサービスに応じて動的にページ内のフィールドを有効にする必要がありますすべての選択されたサービスが実行され、ユーザーが実行するサービスを選択すると(カープレートを変更するなど)、サービスが必要とするフィールドのみをアクティブ化する必要があります。フィールドはデータベースに格納されます)。

public void CheckAll(int pService_Id, Control pPage) 
{ 

    foreach (Control control in pPage.Controls) 
    { 
     busExecutaServico vExecuta = new busExecutaServico(); 

     if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue))) 
     { 
      switch (control.GetType().ToString()) 
      { 
       case "TextBox": 
        TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString()); 
        controleText.Enabled = true; 
        break; 

busExecutaServico私はcontrol.IDを得るように見えることはできません選択した項目がデータベース上の任意のフィールドに一致した場合..

をチェックする方法(EnableField)を含むクラスであることに注意してください。

誰かが私にこの問題を解決するのを手伝ってもらえれば、あるいは別の方法(もし私が試しているものとは全く違っていても)があれば、それは素晴らしいことでしょう。助けて。ありがとう

答えて

1

FindControlは現在の命名コンテナのみを検索するので、Page.FindControlはPageに直接追加されたコントロールを見つけます。例えば、あなたが探していたコントロールを持っていてそれがPageに追加されたリピータコントロールを持っていたら、Page.FindControl経由であなたのリピータコントロールを見つけることができましたが、あなたのリピータ内の子コントロールは見つかりませんでした。ページ内のすべてのコンテナコントロールに対してFindControlを再帰的に実行します。

これはちょっと変わって見えるかもしれませんが、同じページに同じIDを持つコントロールを持つことができます。たとえば、「MyName」という名前のテキストボックスを含むユーザーコントロールのインスタンスが10個ある場合、それぞれの「MyName」フィールドを上書きしないようにしてください。

+0

まあ、コントロールがページに既にある...私は、データベースに格納されているので、control.IDが保存されたIDと一致した場合、私は確認することができますデータベースに –

0

あなたのコードでは、コントロールを検索する必要はありません。あなたはすでにそれを 'control'変数に持っています。

... 
if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue))) 
    ((WebControl)control).Enabled = true; 

P.S.:あなたもちょうどこれを行う、ちょうどWebBrowserコントロールに、テキストボックスにキャストする必要はありません。 control.IDはすでに文字列なので、ID.ToString()も削除する必要があります。

1

の制御にIDが指定されていない限り、コードにはIDのnullが表示されます。また

はなぜ使用: -

TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString()); 

すべてではなく、: -

TextBox controleText = (TextBox)control; 

そして実際にあなただけのEnabledプロパティを変更したい以来の考慮: -

((WebControl)control).Enabled = False; 

私は、多くのケースステートメントを排除すると思う。

3

私は、タイプまたはIDのいずれかでコントロールを見つけるために再帰関数を使用するのが好きです。

これらを調整して、コントロールのコレクションを最初に返してから後で処理することができます。何が起こっているのかを把握するのが簡単かもしれません。

私はここにこのテクニックを学んだ..それだけが名前だhttp://www.west-wind.com/Weblog/posts/5127.aspx

関連する問題