2015-05-14 4 views
0

У меня есть HTML-таблицы на странице:FindControl возвращает пустое текстовое поле объекта/нуль

<table id="tblMain" runat="server" style="margin-left: auto; margin-right: auto;"> 
    <tr> 
     <td> 
      Safety 
     </td> 
     <td> 
      <asp:TextBox ID="txtSafety" Width="400px" ReadOnly="true" TextMode="MultiLine" runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnSafety" runat="server" Width="150px" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="0" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Environment 
     </td> 
     <td> 
      <asp:TextBox ID="txtEnvironment" Width="400px" ReadOnly="true" TextMode="MultiLine" runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="bntEnvironment" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="1" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Quality 
     </td> 
     <td> 
      <asp:TextBox ID="txtQuality" Width="400px" ReadOnly="true" TextMode="MultiLine" runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnQuality" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="2" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Ferrous System 
     </td> 
     <td> 
      <asp:TextBox ID="txtFerrousSystem" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnFerrousSystem" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="3" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Coke System 
     </td> 
     <td> 
      <asp:TextBox ID="txtCokeSystem" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnCokeSystem" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="4" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Coal Yards 
     </td> 
     <td> 
      <asp:TextBox ID="txtCoalYards" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnCoalYards" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="5" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Screenhouse 
     </td> 
     <td> 
      <asp:TextBox ID="txtScreenhouse" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnScreenhouse" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="6" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Process Plant 
     </td> 
     <td> 
      <asp:TextBox ID="txtProcessPlant" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnProcessPlant" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="7" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      New Mill 
     </td> 
     <td> 
      <asp:TextBox ID="txtNewMill" Width="400px" ReadOnly="true" TextMode="MultiLine" runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnNewMill" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="8" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Streamphases 
     </td> 
     <td> 
      <asp:TextBox ID="txtStreamphases" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnStreamphases" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="9" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Furnace Silos Injection 
     </td> 
     <td> 
      <asp:TextBox ID="txtFurnaceSilosInjection" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnFurnaceSilosInjection" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="10" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      CompressedAir 
     </td> 
     <td> 
      <asp:TextBox ID="txtCompressedAir" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnCompressedAir" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="11" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Planned Maintenance 
     </td> 
     <td> 
      <asp:TextBox ID="txtPlannedMaintenance" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnPlannedMaintenance" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="12" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Notifications Raised 
     </td> 
     <td> 
      <asp:TextBox ID="txtNotificationsRaised" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnNotificationsRaised" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="13" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      Manning 
     </td> 
     <td> 
      <asp:TextBox ID="txtManning" Width="400px" ReadOnly="true" TextMode="MultiLine" runat="server"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnManning" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="14" /> 
     </td> 
    </tr> 
    <tr> 
     <td> 
      ShiftHandover 
     </td> 
     <td> 
      <asp:TextBox ID="txtShiftHandover" Width="400px" ReadOnly="true" TextMode="MultiLine" 
       runat="server" OnClick="Edit_Text"></asp:TextBox> 
     </td> 
     <td> 
      <asp:Button ID="btnShiftHandover" Width="150px" runat="server" Text="Edit" 
       OnClick="Edit_Text" CommandArgument="15" /> 
     </td> 
    </tr> 
</table> 

Когда нажата кнопка следующий метод называется:

protected void Edit_Text(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    if (btn != null) 
    { 
     editField = btn.ID.Replace("btn", ""); 
     btn.Visible = false; 
     //Getting and storing rowindex 

     TextBox txt = this.FindControl("txt" + editField) as TextBox; 
     txt.ReadOnly = false; 
     txt.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFFB2"); 
     txt.Focus(); 
     comment = txt.Text; 
     //Further methods unnecessary for this question 
    } 
} 

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

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

Я уже пробовал функцию findcontrol на самой таблице, я использовал «это» как вторую проверку, но обе дали одинаковые результаты.


Я подозреваю, что HTML-таблица является проблемой, так как в другом методе я имею вопросы найти кнопку вручную в HTML таблице:

Button editbtn = tblMain.Rows[GetRowIndex(hdnRowIndex.Value)].Cells[2].Controls[0] as Button; 

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

EDIT - Вот связывание, которое выполняется

private void bindData(DataTable dt) 
{ 
    if (dt.Rows.Count > 0) 
    { 
     foreach (DataColumn col in dt.Columns) 
     { 
      TextBox txt = tblMain.FindControl("txt" + col.ColumnName) as TextBox; 
      if (txt != null) 
      { 
       txt.Text = dt.Rows[0][col].ToString(); 
      } 
     } 
    } 
} 
+0

Ваша таблица не создается с помощью какого-то элемента управления DataBound, такого как GridView, Repeater или ListView, не так ли? –

+0

Вы не могли использовать «отправитель объекта» в качестве кнопки? – leAthlon

+0

Нет, это таблица html, каждая строка похожа на показанную. Есть данные, привязанные к нему, но это делается для каждого текстового поля, в свою очередь, зацикливанием данных и установлением текстового поля из имени поля. Я добавлю его на вопрос – nickson104

ответ

1

Ваша проблема здесь:

this.FindControl("txt" + editField) as TextBox; 

FindControl не является рекурсивным и может найти только непосредственные дочерние управления он был вызван. Здесь вы вызываете его экземпляр страницы, поэтому он ищет только непосредственные дочерние элементы страницы в дереве управления (предположительно это только элемент формы).

Что вам нужно сделать, это выбрать серверный элемент управления прямо над вашими текстовыми полями/кнопками и запустить FindControl. Например, предположим, что это ваш стол, который объявлен как:

<table> 
<%--...all the content from the post goes here...--%> 
</table> 

сделать эту таблицу на стороне сервера:

<table id="TheTable" runat="server"> 

, а затем вызвать FindControl на этой таблице:

TextBox txt = TheTable.FindControl("txt" + editField) as TextBox; 

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

+0

Извините, я никогда не упоминал, я попробовал это сначала, а затем прибегал к ЭТО, как способ проверки. Использование этого метода дает те же результаты – nickson104

+0

@ nickson104, это действительно странно. Можете ли вы разместить разметку всей таблицы? Вы все равно можете оставить только один ряд, меня больше интересует объявление таблицы. – Andrei

+0

Согласен, очень интересно :-) –

0
<table style="width:100%; margin-left:auto; margin-right:auto;" id="tblTst" runat="server"> 
     <tr> 
      <td> 
       <h2> 
        Vehicle Information 
        <asp:Label ID="lblTest" Text="THis is a Test" ForeColor="Salmon" runat="server" /> 
        <asp:Button ID="btnTest" CommandArgument="0" OnClick="btnTest_click" runat="server" Text="Test" /> 
       </h2> 
      </td> 
     </tr> 
     <tr> 
      <td> 
        <asp:Label ID="lblTst2" Text="This is also a Test" ForeColor="Salmon" runat="server" /> 
        <asp:Button ID="btnTest2" CommandArgument="1" OnClick="btnTest_click" runat="server" Text="Test" /> 

      </td> 
     </tr> 
     <tr> 
      <td> 
       <asp:Label ID="lblMsg" runat="server" /> 
      </td> 
     </tr> 
    </table> 


    protected void btnTest_click(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    string comment = ""; 
    string editField = ""; 
    if (btn != null) 
    { 
     editField = btn.ID.Replace("btn", ""); 
     btn.Visible = false; 
     //Getting and storing rowindex 
     foreach(HtmlTableCell cl in tblTst.Rows[Convert.ToInt32(btn.CommandArgument)].Cells) 
     { 
      foreach (Control ctrl in cl.Controls) 
      { 
       if(ctrl is Label) 
       { 
        Label txt = new Label(); 
        txt = ctrl as Label; 
        txt.BackColor = System.Drawing.ColorTranslator.FromHtml("#FFFFB2"); 
        txt.Focus(); 
        comment = txt.Text; 
        lblMsg.Text = comment; 
        return; 
       } 
      } 
     } 
     //Further methods unnecessary for this question 
    } 
} 

}

Это то, что я придумал, это делает работу; однако это довольно грязный способ сделать это, я уверен, что вы можете немного почистить его. Это предназначено только в качестве отправной точки. Большим отличием является то, что вам нужно искать в ячейке элемент управления не в таблице или на странице, также ячейка является ячейкой htmltable, а не только ячейкой таблицы.

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