2015-07-31 5 views
0

Я пытаюсь динамически создать div внутри tab_content, который также является div. Затем я пытаюсь проверить, равна ли текущая строка + "_tab_content" любому ID в tab_content, если это так затем сделайте что-нибудь.FindControl throw null null

Например, строка [ «звезды»]. ToString() напечатает «1», что делает его «1_tab_content»

int i = 1; 
tab_content.Controls.Add(new LiteralControl("<div class='tab-pane' id='" + i.ToString() + "_tab_content' </div>")); 

     foreach(DataRow row in gymsByStars.Rows) 
     { 
      if(row["stars"].ToString() + "_tab_content" == tab_content.FindControl(row["stars"].ToString() + "_tab_content").ID.ToString()) 
      { 
       // Do Something 
      } 
     } 

Однако по какой-то причине, я получаю эту ошибку на заявление линии IF System.NullReferenceException: Object reference not set to an instance of an object. Я, честно говоря, не понимаю, почему, хотя потому, что контроль был динамически создан?

Кто-нибудь понимает, что я делаю неправильно?

+0

так что строка ["начинается"] возвращает 1? в противном случае он не нашел бы. Ведет ли веб-контроль имена, начиная с номера, когда дело доходит до кодирования? Не было бы безопаснее быть _tab_content_1? – BugFinder

+0

@BugFinder Я изменил его, так что это будет tab_content_1, но все равно такая же ошибка .. – mogorilla

+0

Пожалуйста, включите разметку aspx. Думаю, нам нужно это, чтобы понять, что здесь происходит. –

ответ

1

FindControl может находить элементы управления, где установлен runat="server". Возможно, вы захотите добавить Panel вместо LiteralControl.

Похоже, вы пытаетесь найти созданный вами <div> новый LiteralControl(). В дополнение к тому, что это плохая идея (создайте панель вместо этого), она не будет работать, потому что у этого div нет тега runat=server при его создании. Даже тогда я не уверен, что это действительно сработает, обычно вы не должны создавать общие HTML-теги с runat=server в коде.

var pnl = new Panel() { CssClass = "tab-pane", ID = i.ToString() + "_tab_content" }; 
tab_content.Controls.Add(pnl); 

    foreach(DataRow row in gymsByStars.Rows) 
    { 
     if(row["stars"].ToString() + "_tab_content" == tab_content.FindControl(row["stars"].ToString() + "_tab_content").ID.ToString()) 
     { 
      // Do Something 
     } 
    } 
+0

Я забыл упомянуть, что у меня есть тег div с id = "tab_content" и тегом runat = "server" – mogorilla