2014-06-06 1 views
1

Итак, у меня есть эта панель внутри td таблицы.Невозможно получить доступ к динамическим элементам Textbox/DropDown в динамической таблице внутри панели

В этой панели я создаю динамическую таблицу с текстовым полем и выпадающим элементом управления при нажатии кнопки.

Проблема в том, что при попытке получить элементы управления я НЕИСПРАВЛЯЮ. Я проверил буквально, как более 25 веб-сайтов, и не смог найти достойного решения или чего-то подобного моему.

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

  for (int i = 0; i < ClickCount; i++) 
     { 
      //Control myControls = Page.FindControl("table1"); 
      //Panel myPanel = (Panel)mainTable.FindControl("Panel1"); 
      //Table myTable = (Table)myPanel.FindControl("table1"); 
      string FirstName = null; 
      string LastName = null; 
      string Age = null; 
      string PCountry = null; 
      string PCommittee = null; 

      TextBox txtF = (TextBox)Panel1.FindControl("TextBoxF" + i.ToString()); 
      FirstName = txtF.Text; 

      TextBox txtL = (TextBox)Panel1.FindControl("TextBoxL" + i.ToString()); 
      LastName = txtL.Text; 

      TextBox txtA = (TextBox)Panel1.FindControl("TextBoxA" + i.ToString()); 
      Age = txtA.Text; 

      DropDownList ddlPCountry = (DropDownList)myTable.FindControl("ddlPCountry" + i.ToString()); 
      PCountry = ddlPCountry.SelectedValue; 

      DropDownList ddlPCommittee = (DropDownList)myTable.FindControl("ddlCommittee" + i.ToString()); 
      PCommittee = ddlPCommittee.SelectedValue; 


      string groupInsert = "insert into GroupUser (GroupUserID, FirstName, LastName, Age, PreferredCountry, PreferredCommittee) "; 
      groupInsert += "values (@GroupUserID, @FirstName, @LastName, @Age, @PreferredCountry, @PreferredCommittee);"; 

      SqlCommand group = conn.CreateCommand(); 
      group.CommandType = CommandType.Text; 
      group.CommandText = groupInsert; 

      group.Parameters.Add(new SqlParameter("@GroupUserID", ID)); 
      group.Parameters.Add(new SqlParameter("@FirstName", FirstName)); 
      group.Parameters.Add(new SqlParameter("@LastName", LastName)); 
      group.Parameters.Add(new SqlParameter("@Age", Age)); 
      //group.Parameters.Add(new SqlParameter("@PreferredCountry", ddlPCountry.SelectedValue)); 
      //group.Parameters.Add(new SqlParameter("@PreferredCommittee", ddlPCommittee.SelectedValue)); 

      int temp = group.ExecuteNonQuery(); 

     } 

     Response.Redirect("StartPage.aspx"); 

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

 Table table = new Table(); 
     table.ID = "table1"; 

     for (int i = 0; i < ClickCount; i++) 
     { 
      TableRow row1 = new TableRow(); 
      TableRow row2 = new TableRow(); 
      TableRow row3 = new TableRow(); 
      TableRow row4 = new TableRow(); 
      TableRow row5 = new TableRow(); 
      TableRow row6 = new TableRow(); 
      TableRow row7 = new TableRow(); 

      TextBox TxtBoxF = new TextBox(); 
      TextBox TxtBoxL = new TextBox(); 
      TextBox TxtBoxA = new TextBox(); 

      DropDownList ddlPCountry = new DropDownList(); 
      DropDownList ddlPCommittee = new DropDownList(); 

      Label lblF = new Label(); 
      Label lblL = new Label(); 
      Label lblA = new Label(); 
      Label lblPCountry = new Label(); 
      Label lblPCommittee = new Label(); 

      TxtBoxF.ID = "TextBoxF" + i.ToString(); 
      TxtBoxL.ID = "TextBoxL" + i.ToString(); 
      TxtBoxA.ID = "TextBoxA" + i.ToString(); 

      ddlPCountry.ID = "ddlPCountry" + i.ToString(); 
      ddlPCommittee.ID = "ddlPCommittee" + i.ToString(); 

      lblF.ID = "LabelF" + i.ToString(); 
      lblL.ID = "LabelU" + i.ToString(); 
      lblA.ID = "LabelA" + i.ToString(); 
      lblPCountry.ID = "LabelPCountry" + i.ToString(); 
      lblPCommittee.ID = "LabelPCommittee" + i.ToString(); 

      lblF.Text = "First Name: "; 
      lblL.Text = "Last Name :"; 
      lblA.Text = "Age: "; 
      lblPCountry.Text = "Preferred Country: "; 
      lblPCommittee.Text = "Preferred Committee: "; 

      ddlPCountry.DataSource = countryDt; 
      ddlPCountry.DataValueField = "CountryID"; 
      ddlPCountry.DataTextField = "CountryName"; 
      ddlPCountry.DataBind(); 

      ddlPCommittee.DataSource = committeeDt; 
      ddlPCommittee.DataValueField = "CommitteeID"; 
      ddlPCommittee.DataTextField = "CommitteeName"; 
      ddlPCommittee.DataBind(); 

      TxtBoxF.Attributes.Add("runat", "server"); 
      TxtBoxL.Attributes.Add("runat", "server"); 
      TxtBoxA.Attributes.Add("runat", "server"); 

      ddlPCountry.Attributes.Add("runat", "server"); 
      ddlPCommittee.Attributes.Add("runat", "server"); 

      for (int a = 0; a < 2; a++) 
      { 
       TableCell cell1 = new TableCell(); 
       TableCell cell2 = new TableCell(); 

       cell1.Controls.Add(lblF); 
       cell2.Controls.Add(TxtBoxF); 
       row1.Controls.Add(cell1); 
       row1.Controls.Add(cell2); 
      } 

      for (int b = 0; b < 2; b++) 
      { 
       TableCell cell1 = new TableCell(); 
       TableCell cell2 = new TableCell(); 

       cell1.Controls.Add(lblL); 
       cell2.Controls.Add(TxtBoxL); 
       row2.Controls.Add(cell1); 
       row2.Controls.Add(cell2); 
      } 

      for (int c = 0; c < 2; c++) 
      { 
       TableCell cell1 = new TableCell(); 
       TableCell cell2 = new TableCell(); 

       cell1.Controls.Add(lblA); 
       cell2.Controls.Add(TxtBoxA); 
       row3.Controls.Add(cell1); 
       row3.Controls.Add(cell2); 
      } 

      for (int d = 0; d < 2; d++) 
      { 
       TableCell cell1 = new TableCell(); 
       TableCell cell2 = new TableCell(); 

       cell1.Controls.Add(lblPCountry); 
       cell2.Controls.Add(ddlPCountry); 
       row4.Controls.Add(cell1); 
       row4.Controls.Add(cell2); 
      } 

      for (int f = 0; f < 2; f++) 
      { 
       TableCell cell1 = new TableCell(); 
       TableCell cell2 = new TableCell(); 

       cell1.Controls.Add(lblPCommittee); 
       cell2.Controls.Add(ddlPCommittee); 
       row5.Controls.Add(cell1); 
       row5.Controls.Add(cell2); 
      } 

      table.Rows.Add(row1); 
      table.Rows.Add(row2); 
      table.Rows.Add(row3); 
      table.Rows.Add(row4); 
      table.Rows.Add(row5); 

     } 
     Panel1.Controls.Add(table); 
     Panel1.Controls.Add(new LiteralControl("<br />")); 
     Panel1.Controls.Add(new LiteralControl("<br />")); 
     conn.Close(); 

Вот ASPX:

<body> 
<form id="form1" runat="server"> 
<div> 
<h1>Group Registration</h1> 
    <br /> 
    <table style="width:100%;" id="mainTable" runat="server"> 
     <tr> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>First Name:</td> 
      <td> 
       <asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>Last Name:</td> 
      <td> 
       <asp:TextBox ID="txtLastName" runat="server"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>Age:</td> 
      <td> 
       <asp:TextBox ID="txtAge" runat="server"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td class="auto-style1">Contact Number:</td> 
      <td class="auto-style1"> 
       <asp:TextBox ID="txtContactNumber" runat="server"></asp:TextBox> 
      </td> 
      <td class="auto-style1"></td> 
     </tr> 
     <tr> 
      <td>Email Address:</td> 
      <td> 
       <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>Institute</td> 
      <td> 
       <asp:TextBox ID="txtInstitute" runat="server" Width="400px"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td class="auto-style1">Preferred Country:</td> 
      <td class="auto-style1"> 
       <asp:DropDownList ID="ddlCountry" runat="server"> 
       </asp:DropDownList> 
      </td> 
      <td class="auto-style1"></td> 
     </tr> 
     <tr> 
      <td>Preferred Committee:</td> 
      <td> 
       <asp:DropDownList ID="ddlCommittee" runat="server"> 
       </asp:DropDownList> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>Username:</td> 
      <td><asp:TextBox ID="txtUsername" runat="server"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td> 
       <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <asp:Panel ID="Panel1" runat="server"> 
       </asp:Panel> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <asp:Button ID="btnAddAnother" runat="server" OnClick="btnAddAnother_Click" Text="Add Another Member" /> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
      <td>&nbsp;</td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <asp:Button ID="btnRegister" runat="server" Text="Sign Up" OnClick="btnRegister_Click" /> 
      </td> 
      <td>&nbsp;</td> 
     </tr> 
    </table> 
</div> 
</form> 

+0

В HTML страницы иерархия выглядит следующим образом Таблица> панель> Dynamic Table> Dynamic Controls –

+0

Можете ли вы просмотреть исходный код и предоставить код HTML/ASP.NET после загрузки страницы, чтобы мы могли видеть, как и как выглядят ваши объекты? –

+0

Можете ли вы предоставить код ASP.NET для кода? –

ответ

1

Задача 1:

Вы не можете получить доступ к какой-либо контроль на стороне сервера (от C# кода), если он имеет атрибут runat = "server". Итак, вы должны добавить:

.Attributes.Add («runat», «server»);

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

TxtBoxF.Attributes.Add("runat", "server"); 
TxtBoxL.Attributes.Add("runat", "server"); 
TxtBoxA.Attributes.Add("runat", "server"); 

ddlPCountry.Attributes.Add("runat", "server"); 
ddlPCommittee.Attributes.Add("runat", "server"); 

lblF.Attributes.Add("runat", "server"); 
lblL.Attributes.Add("runat", "server"); 
lblA.Attributes.Add("runat", "server"); 
lblPCountry.Attributes.Add("runat", "server"); 
lblPCommittee.Attributes.Add("runat", "server"); 

Задача 2:

Вы должны искать для элементов управления в Panel1, а не таблицы. Однако, поскольку я не вижу ваш код ASPX, я не уверен, имеет ли ваша панель атрибут runat = server.

Я предлагаю вам сделать следующие изменения вашей страницы ASPX:

Измените после тега:

<form id="form1" runat="server"> 
<div> 

к

<div id="myControls" runat="server"> 

Затем, в конце динамического создания управления , изменение:

Panel1.Controls.Add(table); 
Panel1.Controls.Add(new LiteralControl("<br />")); 
Panel1.Controls.Add(new LiteralControl("<br />")); 

к

myControls.Controls.Add(table); 
myControls.Controls.Add(new LiteralControl("<br />")); 
myControls.Controls.Add(new LiteralControl("<br />")); 

Затем в коде контроля доступа вам необходимо изменить:

TextBox txtF = (TextBox)Panel1.FindControl("TextBoxF" + i.ToString()); 
TextBox txtL = (TextBox)Panel1.FindControl("TextBoxL" + i.ToString()); 
TextBox txtA = (TextBox)Panel1.FindControl("TextBoxA" + i.ToString()); 
DropDownList ddlPCountry = (DropDownList)myTable.FindControl("ddlPCountry" + i.ToString()); 
DropDownList ddlPCommittee = (DropDownList)myTable.FindControl("ddlCommittee" + i.ToString()); 

в

TextBox txtF = (TextBox)myControls.FindControl("TextBoxF" + i.ToString()); 
TextBox txtL = (TextBox)myControls.FindControl("TextBoxL" + i.ToString()); 
TextBox txtA = (TextBox)myControls.FindControl("TextBoxA" + i.ToString()); 
DropDownList ddlPCountry = (DropDownList)myControls.FindControl("ddlPCountry" + i.ToString()); 
DropDownList ddlPCommittee = (DropDownList)myControls.FindControl("ddlCommittee" + i.ToString()); 

Возможная проблема 3:

Новые элементы управления должны создается во время Page Init. Таким образом, вы должны принять все динамический код создания управления и положить его в Page_Init:

protected void Page_Init(object sender, EventArgs e) 
{ 
    // Put dynamic controls creation here! 
} 
+0

Как создать элементы управления при загрузке страницы? И первое решение не сработало .... Просьба рассказать мне больше о втором решении. Спасибо .. –

+0

Можете ли вы обновить свой код, я хотел бы посмотреть, как он выглядит сейчас? Я обновил свой код, чтобы выполнить clerify ... –

+0

Я обновил его. –

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