2016-09-03 5 views
0

Ich habe ein Problem, Kontrollen/Kontrollen ID zu bekommen, die ich manuell aus Code hinter erstellt habe. Nach der Untersuchung fand ich, wenn ich die Tabelle und seine alle Komponente einschließlich alle Steuerelemente in Page_Init() -Methode erstellen, sollte beim Rendern nach Postback der Textwert der Textfeldsteuerung für die Seite verfügbar sein. Ich habe versucht, das Textbox-Steuerelement mit FindControl() -Methode zu finden. beim Debuggen erreichen sie nur auf der Linie, wo ich versucht, die Steuerung unter Verwendung Findcontrol() zu lokalisieren und dann eine Ausnahme „Objektverweis nicht auf eine Instanz eines Objekts festgelegt“ throw BalgFehler beim Suchen nach Steuerelementen aus dem Code dahinter.

die Page_Init() Methode ist
protected void Page_Init(object sender, EventArgs e) 
    { 
     Table tb = new Table(); 
     tb.ID = "Table1"; 
     TableRow row1 = new TableRow(); 
     TableCell cell1 = new TableCell(); 
     TableCell cell2 = new TableCell(); 
     TableCell cell3 = new TableCell(); 
     TextBox txtbx = new TextBox(); 
     Button btn = new Button(); 

     cell1.Text = "Name: "; 

     txtbx.ID = "table1_text_input"; 
     txtbx.ValidationGroup = "rosy"; 

     cell2.Controls.Add(txtbx); 
     btn.Text = "Get the input"; 
     btn.ValidationGroup = "rosy"; 
     btn.Click += getBoxinput_Click; 
     cell3.Controls.Add(btn); 

     // adding cells to row1 
     row1.Cells.Add(cell1); 
     row1.Cells.Add(cell2); 
     row1.Cells.Add(cell3); 

     // adding row to table1 
     tb.Rows.Add(row1); 
     Panel1.Controls.Add(tb); 

    } 

Unten ist das Ereignis click click, das die Steuer-ID und ihren Text anzeigen soll. Ich stehe in den letzten Tagen fest damit. jede Hilfe wird geschätzt.

protected void getBoxinput_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if (IsPostBack) 
      { 
       Table t = (Table)Page.FindControl("Panel1").FindControl("Table1"); 
       TextBox tbox; 

       foreach (TableRow tr in t.Rows) 
       { 
        foreach (TableCell tc in tr.Cells) 
        { 
         foreach (Control cnt in tc.Controls) 
         { 
          if (cnt.GetType() == typeof(TextBox)) 
          { 
           tbox = (TextBox)cnt; 
           display.Text += "control id: " + tbox.ID + " control input: " + tbox.Text + "<br/>"; 
          } 
         } 
        } 
       } 
      } 


     } 
     catch (NullReferenceException ex) 
     { 

      display.Text += ex.Message; 
     } 

    } 

Antwort

0

Vielleicht bin ich etwas fehlt, aber warum Sie alle Steuerelemente im globalen Bereich nicht nur von der Klasse setzen (statt nur die Instanzen innerhalb Page_Init erstellen), damit Sie sie in irgendeinem Teil zugreifen können deine Klasse. Natürlich gehe ich davon aus, dass Page_Init und getBoxinput_Click in der gleichen Klasse sind.

EDIT:

Hier ist das Beispiel dafür, wie die Variablen im globalen Bereich setzen:

Table tb; //Declare variables outside any function. 

protected void getBoxinput_Click(object sender, EventArgs e) 
{ 
    tb = new Table(); //Initialize them inside a function. 
} 

Auf diese Weise kann in der Lage seiner tb in jeder Funktion zuzugreifen.

+0

beide Methode in der gleichen Klasse. aber wenn Sie sagen, ziehen Sie alle Steuerelemente im globalen Rahmen, wie Sie das tun? Wenn es nicht zu viel verlangt ist, würden Sie mir bitte einen Code zeigen, der zeigt, wie man alle Steuerelemente von einer Seite zieht. Entschuldigung, ich lerne immer noch. –

+0

Ich bin immer einen Schritt hinter, denke ich. Entschuldigung, nachdem Sie mir davon erzählt haben, dass Sie Kontrollen aus dem globalen Rahmen ziehen, habe ich etwas recherchiert und das gleiche gefunden, was Sie hier erklärt haben. Vielen Dank dafür. aber leider, ein neues Problem entstand, das ist, wenn ich diese Tabelle zu einem Panel, das bereits in der ASPX-Datei ist, nicht den Code hinter der Datei, es wirft einen Fehler. und lass mich nicht die Tabelle zum Panel hinzufügen. es wirft den gleichen Fehler wie zuvor "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt. Panel-Attribut" runat "bereits auf" Server "gesetzt. –

+0

Leider habe ich nicht viel Erfahrung mit ASP.NET, und da Ihr Fehler erwähnt' Das Attribut "runat" ist bereits auf "server" gesetzt. "Ich vermute jetzt, dass etwas mit ASP.NET und nicht mit C# zu tun hat. Meine beste Vermutung wäre, den Wert der Eigenschaft" runat "auf etwas anderes als" server "zu setzen ändere es zurück zu "server". Sorry, ich kann hier nicht mehr nützlich sein. – Agustin0987

0

Ihr Code funktioniert einwandfrei. Hier ist, was ich für das Formular Markup verwendet:

<form id="form1" runat="server"> 
    <asp:Panel ID="Panel1" runat="server"></asp:Panel> 
    <asp:Label ID="display" runat="server"></asp:Label> 
</form> 
Verwandte Themen