2010-09-10 57 views
5

有沒有辦法從類似於findControl()的代碼隱藏中找到ASP.net表單中的前一個和下一個兄弟控件?找到上一個和下一個兄弟控件

有時你不想爲控件分配一個ID,所以你可以做一個父()。findControl(「ID」)以便找到它。當我所能做的就是previousControl()或者其他的東西(la jQuery)時,我厭倦了提供ID。

這對於編寫一個通用函數以解決具有相似佈局且不想逐一解決它們的多個控件的情況也很有用。

感謝您的任何建議。

回答

6

對於後人,這裏是我結束了寫作的功能。工作得非常好(在實際項目中進行測試):

public static Control PreviousControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) - 1; i >= 0; i--) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

要這樣來使用:

Control panel = textBox.PreviousControl(); 

,併爲下一個控制:

public static Control NextControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) + 1; i < siblings.Count; i++) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

這種解決方案比一的優勢的Atzoya是,首先,你不需要原始的控件有一個ID,因爲我根據實例進行搜索。其次,您必須知道,ASP.net會生成幾個Literal控件,以便在您的「真實」控件之間呈現靜態HTML。這就是爲什麼我跳過他們,否則你會保持匹配的垃圾。當然,這個缺點是如果它是一個文字,你無法找到一個控件。這個限制在我的使用中不是問題。

1

我不認爲這是一個建在這樣的功能,但它是非常容易擴展Control類和方法添加到它像這樣:

public static Control PreviousControl(this Control control) 
{ 
    for(int i=0; i<= control.Parent.Controls.Count; i++) 
     if(control.Parent.Controls[i].Id == control.Id) 
     return control.Parent.Controls[i-1]; 
} 

當然更多的處理需求在這裏完成(如果沒有以前的控制或其他場景),但我想你可以看到如何做到這一點。

寫此方法後,你可以這樣調用它

Control textBox1 = textBox2.PreviousControl(); 
+3

謝謝你的建議,但它有兩個問題:首先你認爲原始控件必須有一個ID,這在我的情況下不好。其次,您的函數將與ASP.net生成的Literal控件匹配,以輸出靜態HTML。這是不行的。查看我自己的解決方案,獲取解決所有問題的版本。 – md1337 2010-09-15 14:20:19

相關問題