示例代码:
var div = new HtmlGenericControl("div");
div.Controls.Add(new Literal() { ID = "litSomeLit" });
var lit = (Literal)div.FindControl("litSomeLit");
Assert.IsNotNull(lit);
Run Code Online (Sandbox Code Playgroud)
此代码未通过断言,因为lit为null.调试显示div.Controls肯定包含ID为"litSomeLit"的文字.我的问题是"为什么?" 并且"有没有办法获得对特定ID的控制,而不是一次手动一个元素递归搜索div.Controls []?"
我这样做的原因是我的实际应用并不那么简单 - 我正在编写的方法给出了一个复杂的控件,在许多可能的配置中有几个子控件.我需要访问几个层的特定控件(例如,具有ID"txtSpecificControl"的控件可能在StartingControl.Controls[0].Controls[2].Controls[1].Controls[3]).通常我可以这样做FindControl("txtSpecificControl"),但是当控件刚刚动态创建时(例如上面的示例代码中),这似乎不起作用.
我试图创建应用程序whad动态添加控件.我有主页,我的asp:内容在这里:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server">
</asp:ScriptManager>
<div style="margin: 10px">
<asp:UpdatePanel ID="updatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="myPlaceHolder" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
<asp:Button ID="btnAdd" runat="server" Text="Add" />
Run Code Online (Sandbox Code Playgroud)
点击btnAdd后,我想添加两个文本框.我试着像http://jagdeepmankotia.wordpress.com/2010/01/30/dynamically-add-controls-in-asp-net-c/
这是我的代码:
static int myCount = 1;
private TextBox[] color;
private TextBox[] text;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
color = new TextBox[myCount];
text = new TextBox[myCount];
for (int i = 0; i < myCount; i++)
{
TextBox tbColor = new TextBox();
tbColor.ID = …Run Code Online (Sandbox Code Playgroud) 我试图访问GridView中的PagerTemplate内的LinkButton.
但是,我得到一个NullReferenceException并且我不知道我在这里做错了什么.
我试过以下......
((LinkButton)GridView1.BottomPagerRow.FindControl("lnkbtnPrevious"));
((LinkButton)GridView1.FindControl("lnkbtnPrevious"));
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
谢谢!
为什么方法在调用之前FindControl()返回.nullFormViewDataBind()
之后它会正确返回所有内容?
有什么解决方法?
呼叫DataBind()的第一次调用之前FindControl()?
我有FormView我的页面标记:
<asp:FormView ruanat="server" ID="FormView1" DataSourceID="SqlDataSource1" OnDataBinding="FormView1_DataBinding" OnDataBound="FormView1_DataBound">
<InsertItemTemplate>
<uc:UserControl1 runat="server" ID="ucUserControl1" />
</InsertItemTemplate>
</asp:FormView>
<asp:SqlDataSource runat="server" ID="SqlDataSource1" SelectCommand="EXEC someSP" />
Run Code Online (Sandbox Code Playgroud)
它是代码隐藏的WAS:
protected void FormView1_DataBound(object sender, EventArgs e)
{
var c = FormView1.FindControl("ucUserControl1"); // returns null
}
Run Code Online (Sandbox Code Playgroud)
BECAME:
protected void FormView1_DataBinding(object sender, EventArgs e)
{
FormView1.ChangeMode(FormViewMode.Insert);
}
protected void FormView1_DataBound(object sender, EventArgs e)
{
if (FormView1.CurrentMode = FormViewMode.Insert)
{
var c = FormView1.FindControl("ucUserControl1"); // returns null no more!
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我能够FormView在数据绑定后找到控制权.但我不是.为什么?
我需要找到这个<a>标签驻留在一个FormView控件中,我需要根据条件删除这个标签,但我找不到它使用FormView.FindControl方法
<asp:UpdatePanel ID="upDiscipline" runat="server">
<ContentTemplate>
<asp:FormView ID="fvMediaIntro" runat="server">
<ItemTemplate>
<div class="clipControls">
<a runat="server" id="iNeedToFindThis" href="#">here</a>
</div>
</ItemTemplate>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
我试过fvMediaIntro.FindControl()和fvMediaIntro.Row.FindControl(),既不工作.有什么想法吗?
我有一个ASP.NET页面,注册了2个用户控件.第一个只有一个按钮.第二个是简单文本,默认隐藏.我想要的是在单击第一个按钮时(即按钮单击事件)使第二个可见.
ASP.NET页面:
<%@ Page Title="" Language="C#" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Register Src="~/UC_button.ascx" TagName="button" TagPrefix="UC" %>
<%@ Register Src="~/UC_text.ascx" TagName="text" TagPrefix="UC" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MyTestContent" Runat="Server">
<UC:button ID="showbutton1" runat="server" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MyTestContent2" Runat="Server">
<UC:text runat="server" Visible="false" ID="text1" />
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
UC_Button.ascx.cs:
protected void button1_Click(object sender, EventArgs e)
{
Button btnSender = (Button)sender;
Page parentPage = btnSender.Page;
UserControl UC_text = (UserControl)parentPage.FindControl("text1");
UC_text.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我Object reference not set to an instance of an object.在代码的最后一行得到了众所周知的错误.
编辑:
首次发布此内容时,我忘记提及一件事.用户控件在不同的<asp:Content></asp:Content>控件中(我编辑了上面的示例).如果我把它们放在相同的占位符代码中工作就好了.如果我将它们放在单独的内容占位符中,我无法使用findcontrol以任何方式找到它们.为什么这样,我怎么能找到它们?
我有一个下拉列表:
<asp:DropDownList ID="ddlGoalKeeper" runat="server">
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)
一个不错的小人。我有一些代码可以找到它:
DropDownList myControl1 = (DropDownList)Page.FindControl("ddlGoalKeeper");
Run Code Online (Sandbox Code Playgroud)
不是..只是我myControl1没有设置...所以当我稍后在我的代码中尝试将可见设置为true时,它不起作用。
有任何想法吗?
在FormView中切换模式时,如何从代码隐藏中找到控件? 看起来你不能在Page_Load事件期间使用FindControl,因为它将在先前显示的模板而不是新选择的模板中搜索控件.我怀疑你不能单独依赖PageLoad但是必须在另一个事件中找到控件,比如OnDataBound,但你真的应该这样做吗?我在我的日子里看过几个没有OnDataBound等事件的表单...
关于我的具体案例的更多细节: 我有一个formview,其中ItemTemplate,InsertItemTemplate和EditItemTemplate都包含相同的文本框.(它在所有模板中都有相同的ID)
在Page_Load事件期间,我使用FindControl来定位文本框并更改其可见性.在最初加载formview时工作得很好,但由于某种原因,当表单更改模式/更改模板时它不起作用(在页面呈现后,您看到文本框可见性不正确)
例如,从read模式切换到编辑模式 - formview.Mode将设置为FormViewMode.Edit,但在PageLoad事件期间使用FindControl时,它将搜索ItemTemplate中的控件而不是EditItemTemplate.因此,如果您在所有模板中都有一个具有相同ID的控件,它将在不正确的模板中找到该控件,并且在页面加载后,您将非常困惑为什么加载的控件不具有相同的属性正如你在pageLoad期间在调试器中检查它时所想的那样.
在base.master上:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Base.master.cs" Inherits="WebApplicationControlTest.Base" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>The title</title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
There is a content here: <br />
<asp:ContentPlaceHolder ID="body" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在嵌套的主人身上
<%@ Master Language="C#" MasterPageFile="~/MasterPages/Base.Master" AutoEventWireup="true" CodeBehind="NestedMasterPageTest2.master.cs" Inherits="WebApplicationControlTest.MasterPages.NestedMasterPageTest2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="PlaceHolder" ContentPlaceHolderID="body" runat="server">
This is inside the NestedPage<br />
<asp:ContentPlaceHolder ID="PlaceHolderLeft" runat="server">
</asp:ContentPlaceHolder>
<asp:ContentPlaceHolder ID="PlaceHolderRight" runat="server">
</asp:ContentPlaceHolder> …Run Code Online (Sandbox Code Playgroud) findcontrol ×10
asp.net ×9
formview ×4
c# ×3
.net ×2
asp.net-2.0 ×1
custompaging ×1
databound ×1
dynamic ×1
gridview ×1
master-pages ×1
web-controls ×1