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