2015-06-08 72 views
0

我有一個在動態添加pnRoom(面板)查找控制返回null

ImageButton imgbtn = new ImageButton(); 
imgbtn = new ImageButton(); 
imgbtn.Height = 25; 
imgbtn.CssClass = "bulb"; 
imgbtn.ID = i++; 
pnRoom.Controls.Add(imgbtn); 

控制,並找到控制imgbtn

protected void LoadBulb() 
    {   
      foreach (Control c in pnRoom.Controls) 
      { 
       ImageButton img = (ImageButton)c.FindControl("imgbtn"); 
       img.ImageUrl = "~/path/images/bulb_yellow_32x32.png"; 
      } 
    } 

當我收到值它總是返回null。我嘗試但沒有運氣。我需要你的幫助。謝謝 !!!

未將對象引用設置爲對象的實例。

回答

2
  • 你必須使用FindControlId您已經分配,​​因爲您使用的是連續數,你必須用這個來代替"imgbtn"
  • 您必須在NamingContainer上使用FindControl - 您正在搜索的對象。您在控制系統上使用FindControl
  • 如果你在面板上使用循環,你會得到所有的控制(非遞歸),所以你根本不需要使用FindControl。你希望所有ImageButton的,你可以使用Enumerable.OfType

    foreach(var img in pnRoom.Controls.OfType<ImageButton>()) 
    { 
        img.ImageUrl = "~/path/images/bulb_yellow_32x32.png"; 
    } 
    

,如果你不希望採取一切ImageButton的或你害怕在未來還有其他ImageButton的你想省略,更好的方法是通過String.StartsWith給他們一個有意義的前綴和過濾器。

。假定你已經給了他們所有imgbtn_(和之後的數字):

var imgBtns = pnRoom.Controls.OfType<ImageButton>().Where(i => i.ID.StartsWith("imgbtn_")); 
foreach(var img in imgBtns) 
{ 
    // ... 
} 

記住添加using System.Linq如果不是已經發生了。