2011-10-24 9 views
0

私のSharePointページにあるSPDataSourceコントロールを検索しようとしています。私はおそらくうまく動作する次のコードを発見した、私はちょうどそれに渡すべきか分からない。私はより多くを持っているようSharePointページでのコントロールの検索

public static Control FindControlRecursive(Control Root, string Id) 
{ 
    if (Root.ID == Id) 
     return Root; 

    foreach (Control Ctl in Root.Controls) 
    { 
     Control FoundCtl = FindControlRecursive(Ctl, Id); 

     if (FoundCtl != null) 
      return FoundCtl; 
    } 

    return null; 
} 

私はそれがページ全体を検索したり、コントロールがしていることを非常に少なくとものContentPlaceHolder持っているのか分からない。

編集

が見えますここでの初歩的な問題。説明する方法はわかりませんが、コードを実行する前にページを開いているわけではありません。

using (SPWeb web = thisSite.Site.OpenWeb("/siteurl/,true)) 

私は以下のページを見つけようとしたときに、オブジェクト参照がオブジェクトのインスタンスに設定されていない状態になっています。私はちょうど種類のものを考え出すに沿ってつまずいてるよう

var page = HttpContext.Current.Handler as Page; 

はおそらく、私はこれについて間違った道を行くよ、私はここに私の幼児期にいますよ!

+0

ケアのようにそれを呼び出すこの1

public static T FindControlRecursive<T>(Control control, string controlID) where T : Control { // Find the control. if (control != null) { Control foundControl = control.FindControl(controlID); if (foundControl != null) { // Return the Control return foundControl as T; } // Continue the search foreach (Control c in control.Controls) { foundControl = FindControlRecursive<T>(c, controlID); if (foundControl != null) { // Return the Control return foundControl as T; } } } return null; } 

を試してみてください? –

+0

テンプレートからサイトを作成するリストのイベントハンドラがあります。テンプレートサイトのSPDataSourceをリストアイテムから引き継ぐデータで更新します。主に、SPDataSourceのSelectCommandを更新して、データをフィルタリングすることを検討しています。 – Mike

答えて

1

実際にはSharePoint固有のものではありませんが、それはc#asp.netです。

とにかく、あなたは

var myElement = (TextBox)FindControlRecursive(control, "yourelement"); 
// or 
var myElement = FindControlRecursive(control, "yourelement") as TextBox; 

は、このような方法を記述するが、より効率的な方法があり、同様のリターンをキャストする必要があります。この

var page = HttpContext.Current.Handler as Page; 
var control = page; // or put the element you know exist that omit (is a parent) of the element you want to find 
var myElement = FindControlRecursive(control, "yourelement"); 

ほとんどのようにそれを呼び出すことができ、ここに1つの簡単な例があります

public static Control FindControlRecursive(string id) 
{ 
    var page = HttpContext.Current.Handler as Page; 
    return FindControlRecursive(page, id); 
} 

public static Control FindControlRecursive(Control root, string id) 
{ 
    return root.ID == id ? root : (from Control c in root.Controls select FindControlRecursive(c, id)).FirstOrDefault(t => t != null); 
} 

これは私が先に提案したのと同じ方法です。

大きなページを扱う場合、上記の方法は少し遅いかもしれませんが、ジェネリックを使用する方法を目指してください。彼らは伝統的な方法よりもずっと高速です。

は、あなたがコードを経由してSPDataSourceを見つけようとしている理由を説明するために、この

var mytextBox = FindControlRecursive<TextBox>(Page, "mytextBox"); 
+0

自分の投稿を編集しました。あなたのコードを試してくれないほど大きな問題があると思います。 – Mike

関連する問題