C# 复选框。选中错误:对象引用未设置为对象的实例

C# 复选框。选中错误:对象引用未设置为对象的实例,c#,asp.net,checkbox,C#,Asp.net,Checkbox,我有一个列表视图,我在其中使用了一个更新面板,所有代码都在更新面板中。我使用了一个复选框和一个事件来检查复选框是否被选中,文本框的可见性应该为true,下拉列表的可见性应该为false。但选中复选框后,软件会中断并显示对象引用,而不会设置为对象的实例。错误。我的asp.net代码: <EditItemTemplate> <asp:UpdatePanel ID="upchk" runat="server" UpdateMode="Conditional">

我有一个列表视图,我在其中使用了一个更新面板,所有代码都在更新面板中。我使用了一个复选框和一个事件来检查复选框是否被选中,文本框的可见性应该为true,下拉列表的可见性应该为false。但选中复选框后,软件会中断并显示对象引用,而不会设置为对象的实例。错误。我的asp.net代码:

<EditItemTemplate>
    <asp:UpdatePanel ID="upchk" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            ///
            <td><asp:Label ID="label17" CssClass="fasele" runat="server" Text="رشته : ">
                </asp:Label></td>
            <td><asp:DropDownList ID="DropDownList2" DataSourceID="SqlDataSource1" 
                DataTextField="reshte" DataValueField="reshteId" AutoPostBack="True" 
                runat="server" ></asp:DropDownList></td>
            <td>

            <asp:TextBox ID="TextBox8" runat="server"></asp:TextBox>
            <asp:CheckBox ID="CheckBox1" runat="server" 
                oncheckedchanged="CheckBox1_CheckedChanged" AutoPostBack="true" 
                EnableViewState="true" /> : افزودن رشته جدید</td>
            /////
        </ContentTemplate>  
        <Triggers>
            <asp:AsyncPostBackTrigger  EventName="checkedchanged" ControlID="CheckBox1" />
        </Triggers> 
    </asp:UpdatePanel>
</EditItemTemplate>

事实证明,FindControl只在父控件级别进行搜索

您需要的是一个递归findcontrol方法,该方法将查找您的子控件:

public static Control FindControlRecursive(this Control control, string id)
{
  if (control == null)
  {
      throw new ArgumentNullException("control")
  }

  foreach (Control childControl in control.Controls)
  {
      if (childControl.ID == id)
      {
         return childControl;
      }

      Control child = FindControlRecursive(ctl, id);
      if (child != null)
      {
          return child;
      }
}

return null;

希望有帮助

在您的情况下,您可以找到复选框的父项
UpdatePanel
,并在其中查找控件,如下所示:

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    CheckBox chk = (CheckBox)sender;
    TextBox txtrshte = (TextBox)chk.Parent.FindControl("TextBox8");
    DropDownList drpreshte = (DropDownList)chk.Parent.FindControl("DropDownList2");

    if (chk.Checked)
    {
        txtrshte.Visible = true;
        drpreshte.Visible = false;

    }
}
编辑:

我可以看出您的表结构存在严重问题。您不能以这种方式通过
UpdatePanel
扩展表。您必须将更新面板移动到父表中,并在更新面板中创建一个新表。否则,将导致呈现的html混乱,控件加倍等。更正后的标记应如下所示:

<EditItemTemplate>
    <tr><td colspan="3">
        <asp:UpdatePanel ID="upchk" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                ///
                <table><tr>
                    <td><asp:Label ID="label17" CssClass="fasele" runat="server" Text="رشته : ">
                        </asp:Label></td>
                    <td><asp:DropDownList ID="DropDownList2" DataSourceID="SqlDataSource1" 
                        DataTextField="reshte" DataValueField="reshteId" AutoPostBack="True" 
                        runat="server" ></asp:DropDownList></td>
                    <td>

                    <asp:TextBox ID="TextBox8" runat="server"></asp:TextBox>
                    <asp:CheckBox ID="CheckBox1" runat="server" 
                        oncheckedchanged="CheckBox1_CheckedChanged" AutoPostBack="true" 
                        EnableViewState="true" /> : افزودن رشته جدید</td>
                </tr></table>
                /////
            </ContentTemplate>  
            <Triggers>
                <asp:AsyncPostBackTrigger  EventName="checkedchanged" ControlID="CheckBox1" />
            </Triggers> 
        </asp:UpdatePanel>    
        </td></tr>
</EditItemTemplate>

///
: افزودن رشته جدید
/////

页面加载时元素没有初始化吗?(不是我的事,asp…:)(谢谢,但我搞糊涂了!我到底能做什么!?不需要在任何地方调用此函数?您可能希望检查问题及其答案。我这样做,没有错误。但当我运行网站并选中复选框时,会在原始编辑模板的基础上创建一份编辑模板。你可以在这个链接中看到我的意思:你可以在顺序复选框上看到,最后一个文本框的内容重复!这是因为错误的标记。不能使用
UpdatePanel
包装表的一部分。看我的编辑。太好了!你说得对。现在一切都好了。所以谢谢
<EditItemTemplate>
    <tr><td colspan="3">
        <asp:UpdatePanel ID="upchk" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                ///
                <table><tr>
                    <td><asp:Label ID="label17" CssClass="fasele" runat="server" Text="رشته : ">
                        </asp:Label></td>
                    <td><asp:DropDownList ID="DropDownList2" DataSourceID="SqlDataSource1" 
                        DataTextField="reshte" DataValueField="reshteId" AutoPostBack="True" 
                        runat="server" ></asp:DropDownList></td>
                    <td>

                    <asp:TextBox ID="TextBox8" runat="server"></asp:TextBox>
                    <asp:CheckBox ID="CheckBox1" runat="server" 
                        oncheckedchanged="CheckBox1_CheckedChanged" AutoPostBack="true" 
                        EnableViewState="true" /> : افزودن رشته جدید</td>
                </tr></table>
                /////
            </ContentTemplate>  
            <Triggers>
                <asp:AsyncPostBackTrigger  EventName="checkedchanged" ControlID="CheckBox1" />
            </Triggers> 
        </asp:UpdatePanel>    
        </td></tr>
</EditItemTemplate>