2016-04-07 5 views
1

Ich stieß auf ein Problem, ein Textbox-Steuerelement auf der gleichen Seite zu finden. Es gibt mir eine Null, wenn ich es debugge.Kann das Textfeld mit FindControl C nicht finden #

Hier ist mein Code:

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(); 
    } 

Problem gelöst: ich nicht angeben, dass die Textbox in einem Container eingebaut war (z ContentPlaceHolder1.). Hier

ist der korrigierte Code:

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

Statt Kontrolle finden. Bitte versuchen Sie Page.FindControl & this.Page.FindControl und lassen Sie mich wissen, ob es Ihnen hilft –

+0

Wo ist das Textfeld definiert? ist es in einer anderen Containersteuerung wie Gridview? – Adil

+0

Ich tat das, aber es hat nicht funktioniert. Ich fand heraus, warum es immer Null zurückgab, und der Grund war, dass ich nicht angegeben hatte, dass das Steuerelement in einem Container war. Zum Beispiel, die ContentPlaceHolder1 –

Antwort

1

Sie sollten nur Ihre Textbox als Absender Objekt wie folgt an:

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

natürlich müssen Sie ändern Ihre Methode auch, um das TextBox-Objekt zu akzeptieren.

und dies ist nur sinnvoll, wenn Sie denselben Ereignishandler für mehr als ein Textfeld verwenden.

1

sollte es sein, Arbeit es versuchen,

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

Es ist schwierig, eine Steuerung zu finden, indem ID.so versuchen diesen Code

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(); 
     } 

und

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

Super! Ich mag diesen Weg besser. Danke für das Teilen mit mir –

+0

Willkommen @RonT. –