checkbox .checked error:对象引用未设置为对象的实例

时间:2014-04-15 20:42:43

标签: c# asp.net checkbox

我有一个listview,我在其中使用了更新面板,所有代码都在更新面板中。我使用了一个复选框和一个事件来检查是否选中了复选框,文本框可见性应为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>

我的.cs代码:

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

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

    }
}

2 个答案:

答案 0 :(得分:1)

在您的情况下,您可以找到复选框的父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扩展表格。您必须在父表<td>中移动更新面板,并在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>

答案 1 :(得分:0)

事实证明,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;

希望有所帮助!