访问 detailsview 控件内部的 Label 控件

Access Label control inside the detailsview control

我正在尝试设置 detailsview 中的标签控件的文本,但它不起作用。但它显示错误 "Object reference not set to an instance of an object." 谁能指导我.. ?? 我的前端代码是:

<asp:Panel ID="sub_question_panel" runat="server">
   <asp:DetailsView ID="DetailsView1" runat="server" CellPadding="6"    ForeColor="#333333" AutoGenerateRows="false" GridLines="None" >
   <Fields>
      <asp:TemplateField>
         <ItemTemplate>
               <table id="Question_view_table">
                  <tr>
<td style="font-family:Arial Rounded MT;">
<label id="Question_no"><span style="font-size:20px;">Question</span>:</label>
<asp:Label ID="Ques_id_label" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td style="height:20px"></td>
</tr>
<tr>
<td style="font-family:'Times New Roman'; font-size:18px; ">
<label id="Question_detail"><%# Eval ("Question") %></label>
</td>
</tr>
<tr>
<td style="font-family:'Times New Roman'; font-size:18px;">
<ol style="list-style:upper-alpha">
<li>
<label id="optn1"> &nbsp&nbsp<%# Eval ("Option1") %></label></li>
<li>
<label id="optn2"> &nbsp&nbsp<%# Eval ("Option2") %></label></li>
<li>
<label id="optn3"> &nbsp&nbsp<%# Eval ("Option3") %></label></li>
<li>
<label id="optn4"> &nbsp&nbsp<%# Eval ("Option4") %></label></li>
</ol>
</td>
</tr>
            </table>
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
</asp:Panel>

我的后端代码是:

protected void Page_Load(object sender, EventArgs e)
{
      int question_id = 1;
      Label Question_Id = DetailsView1.FindControl("Ques_id_label") as Label;
      Question_Id .Text = Convert.ToString(question_id);
} 

您使用 FindControl 查找 Ques_id_label,但随后仍正常引用它:Ques_id_label.Text =

它应该是 Question_Id.Text = Convert.ToString(question_id);,用你用 FindControl 分配的 ID。

但是它甚至编译了吗?你用Visual Studio这样的编辑器吗?因为当我尝试你的代码片段时,它给出了错误 The name 'Ques_id_label' does not exist in the current context,这是应该的。

您必须对一行使用 FindControl,而不是 DataListView

您想通过 id 找到您的标签,但是哪一个?对于每一行,您都有一个带有 id 'Ques_id_label' 的标签。因此,要查找特定标签,您必须指定预期的行。我没有使用 DataLisView 但我知道它在逻辑上类似于 Asp:Repeater 。从一行发送命令时,在 Repeater 的一行中查找控件:

protected void SaveAnswer(Object Sender, RepeaterCommandEventArgs e)
{
    Label Ques_id_label = (Label)e.Item.FindControl("Ques_id_label");

其中 e.item 您指定了预期的行。