我有一个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;
}
}
答案 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;
希望有所帮助!