2016-04-07 3 views
1

У меня возникла проблема с попыткой найти элемент управления текстовыми полями на той же странице. Он продолжает давать мне нуль, когда я его отлаживаю.Не удается найти текстовое поле с FindControl C#

Вот мой код:

public void UpdateTimeLog(string input) 
    { 
     string timeNumber = "txtTime" + input; 
     TextBox myTextbox = (TextBox)FindControl(timeNumber); 

     sqlConnection.Open(); 
     using (var command = new SqlCommand("UPDATE [JobSheet] SET [Time" + input + "][email protected]" + input + " WHERE [JobShtId][email protected]", sqlConnection)) 
     { 
      command.Parameters.AddWithValue("@JobShtId", jobSheetId); 
      command.Parameters.AddWithValue("@Time" + input + "", myTextbox.Text); 
      command.ExecuteNonQuery(); 
     } 
     sqlConnection.Close(); 
    } 

проблема решена: я не указал, что элемент управления TextBox был в контейнере (например ContentPlaceHolder1.).

Вот исправленный код:

public void UpdateTimeLog(string input) 
    { 
     var container = Master.FindControl("ContentPlaceHolder1"); 
     string timeNumber = "txtTime" + input; 
     TextBox myTextbox = (TextBox)container.FindControl(timeNumber); 

     sqlConnection.Open(); 
     using (var command = new SqlCommand("UPDATE [JobSheet] SET [Time" + input + "][email protected]" + input + " WHERE [JobShtId][email protected]", sqlConnection)) 
     { 
      command.Parameters.AddWithValue("@JobShtId", jobSheetId); 
      command.Parameters.AddWithValue("@Time" + input + "", myTextbox.Text); 
      command.ExecuteNonQuery(); 
     } 
     sqlConnection.Close(); 
    } 
+0

Вместо найти контроля. Пожалуйста, попробуйте Page.FindControl & this.Page.FindControl и дайте мне знать, если это поможет вам –

+0

Где указано текстовое поле? это в каком-то другом контейнере, таком как gridview? – Adil

+0

Я сделал это, но это не сработало. Я выяснил, почему он возвращал null, и причина была в том, что я не указал, что элемент управления находится в контейнере. Например, ContentPlaceHolder1 –

ответ

1

вы должны просто отправить текстовое поле как объект отправителя, как это:

UpdateTimeLog("2",(TextBox)sender); 

, конечно, вы должны изменить ваш метод также принять объект TextBox.

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

1

она должна быть работа попробовать,

TextBox myTextBox = (TextBox)(this.Controls[("txtTime" + input)]).Text); 
1

трудно найти управление с помощью ID.so попробовать этот код

public static Control[] FlattenHierachy(Control root) 
     { 
      List<Control> list = new List<Control>(); 
      list.Add(root); 
      if (root.HasControls()) 
      { 
       foreach (Control control in root.Controls) 
       { 
        list.AddRange(FlattenHierachy(control)); 
       } 
      } 
      return list.ToArray(); 
     } 

и

public void UpdateTimeLog(string input) 
     { 
      string timeNumber = "txtTime" + input; 
      // TextBox myTextbox = (TextBox)FindControl(timeNumber); 
      Control[] allControls = FlattenHierachy(Page); 
      foreach (Control control in allControls) 
      { 
       TextBox textBox = control as TextBox; 
       if (textBox != null && textBox.ID == timeNumber) 
       { 
        textBox.Text = "Hello";//Do your other stuff 
       } 
      } 

      //Rest is ommited 
     } 
+0

Удивительный! Мне нравится этот путь лучше. Спасибо, что поделились этим со мной –

+0

welcome @RonT. –

Смежные вопросы