对不起,但我不明白为什么这不起作用.编译后,我收到一个"空引用异常".请帮忙.
public partial class labs_test : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
if (TextBox1.Text != "")
{
Label Label1 = (Label)Master.FindControl("Label1");
Label1.Text = "<b>The text you entered was: " + TextBox1.Text + ".</b>";
}
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
Label Label1 = (Label)Master.FindControl("Label1");
Label1.Text = "<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>";
}
}
Run Code Online (Sandbox Code Playgroud)
和用户界面:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="labs_test" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content> …Run Code Online (Sandbox Code Playgroud) 在一个站点上,我只使用单级主页,在使用该主页的页面中,我可以执行此操作.Master.FindControl("controlName")来访问该控件.工作良好.
但是,在具有两个母版页级别的站点上使用相同的代码.以MainMaster为主的MainMaster和SpecificMaster.
因此,在使用SpecificMaster的页面上,FindControl为对象返回null.我看到的唯一区别是主页的嵌套.
当我设置断点并查看page.Master时,它显示的是SpecificMaster,而SpecificMaster正确显示MainMaster作为其主节点,但FindControl仍然失败.
当我在IE中查看源代码时,控件被正确命名,没有.NET正在进行中.
这有什么想法?
TIA!
我有一个ASP.NET站点,我试图通过C#代码隐藏文件中的ID访问div元素.基本上我想看看是否存在div元素,如果存在,则改变其属性.
我发现很多资源都指向了十几种不同的解决方案,而且似乎都没有.
ASP.Net页面上的HTML:
<div class="contentArea">
<div class="block" id="button1" runat="server">
Some Content Here
</div>
<div class="block" id="button2" runat="server">
Some Content Here
</div>
<div class="block" id="button3" runat="server">
Some Content Here
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
C#代码背后(我尝试过的例子):
System.Web.UI.HtmlControls.HtmlGenericControl div1 = (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("button1");
div1.Attributes["class"] = "classNameHere";
Run Code Online (Sandbox Code Playgroud)
要么
Control div1 = this.FindControl("button1");
div1.GetType();
Run Code Online (Sandbox Code Playgroud)
当代码到达上述每个示例的第二行时,我收到一个错误:
你调用的对象是空的.
如果我尝试以下方法:
if (div1 != null)
{
// Do Something;
}
Run Code Online (Sandbox Code Playgroud)
什么都没发生,因为div1总是设置为null.具有讽刺意味的是,如果我查看Locals窗口并检查它,我可以在列表中看到按钮#id,所以我知道它们在那里,但是系统表现得好像没有找到控件.
我的最终目标是找到按钮div的最大ID#(查看我的html示例,最大ID将是3(button3).也许有更好的方法去做,但无论哪种方式,一旦我有我的max id,我希望能够触及每个div并改变一些css属性.
虽然我可以通过jQuery轻松完成所有这些操作,但在本例中我需要在C#中执行此操作.
任何帮助深表感谢.如果您需要更多信息,请告诉我们.
更新 我从头开始创建一个新的C#Web项目.添加母版页(而不是更改母版页)并使用母版页添加网页表单后,我只在内容ID ="Content2"下的网络表单中添加了一行:
<div id="button1"></div>
Run Code Online (Sandbox Code Playgroud)
从c#代码背后我仍然遇到与以前完全相同的问题.
最后的更新和答案 我很震惊没有人(包括我自己)从上述更新中抓住了我的错误.当我在div下从头开始创建一个新项目时,我从未放过runat ="server".以下是我从头开始在新项目中解决问题的方法:
将runat ="server"添加到div:
<div id="button1" runat="server"></div>
Run Code Online (Sandbox Code Playgroud)
然后我在MasterPage下的ContentPlaceHolder上做了一个FindControl:
ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1"); …Run Code Online (Sandbox Code Playgroud) 今天是个好日子,
我正在ASP.NET中构建一个页面,并在此过程中使用母版页.
我的母版页中有一个内容地点持有人名称"cphBody",其中包含该母版页作为母版页的每个页面的正文.
在ASP.NET网页中,我有一个Content标签(引用"cphBody"),它还包含一些控件(按钮,Infragistics控件等),我想在CodeBehind文件中访问这些控件.但是,我不能直接这样做(this.myControl ...),因为它们嵌套在Content标签中.
我找到了FindControl方法的解决方法.
ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder) Master.FindControl("cphBody");
ControlType myControl = (ControlType) contentPlaceHolder.FindControl("ControlName");
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我怀疑它不是一个非常好的设计.你们知道更优雅的方式吗?
谢谢!
Guillaume Gervais.
希望你有一个愉快的星期五和东西...好吧,所以这是我的问题:
我的所有ASPX页面都继承自一个名为BasePage的基类.BasePage继承自:
System.Web.UI.Page
Run Code Online (Sandbox Code Playgroud)
现在,如何从我的页面基页访问/设置我的aspx页面中的控件?我试过这个:
HyperLink hypMainMenu = (HyperLink)Page.FindControl("hypMainMenu");
hypMainMenu.NavigateUrl = AppConfiguration.AppSettings.Urls.MainMenu;
Run Code Online (Sandbox Code Playgroud)
但是hypMainMenu总是空的 - 我找不到这个混蛋.有任何想法吗?或者这是一种不好的做法,有人可以推荐一种更好的方法吗?
提前致谢!
我正在开发一个简单的婚礼清单应用程序,客人可以预订他们想要为新娘和新郎购买的礼物.Reserve页面在几个面板中包含几个字段,所有字段都包含在FormView中.
用户输入他们的姓名,电子邮件和他们想要保留的项目数量,页面将在数据库中进行必要的预订.
我的第一个问题是在FormView_ItemCommand中,我无法引用FormView中的任何其他控件....我认为这是FindControl的一个案例 - 但是当我从来不需要它时,为什么我需要一个Formview对于ListViews或DetailViews?
其次,我知道以下代码有效..
Dim oCtrl as TextBox = Me.fvwReservation.FindControl("txtEmail")
Dim Test As String = oCtrl.Text
Run Code Online (Sandbox Code Playgroud)
......但为什么我不能用......
Dim Test As String = Me.fvwReservation.FindControl("txtEmail").Text
Run Code Online (Sandbox Code Playgroud)
??
最后,我认为在这种情况下我不需要它,但我一直在研究递归的FindControl变体,但我实际上并没有找到实际编译的变体!有什么建议?
一篇文章很多 - 提前谢谢.
免费代码片段:
<asp:FormView ID="fvwReservation" runat="Server" DataSourceID="dsGift">
<ItemTemplate>
<asp:Panel runat="server" ID="pnlDetails">
<h3>Reserve Item: <%#Eval("ShortDesc")%></h3>
<p>You have chosen to reserve the <em><%#Eval("LongDesc")%></em> gift.</p>
<p>Please enter your details below to confirm the reservation.</p>
</asp:Panel>
<asp:Panel runat="server" ID="pnlConfirm">
<div class="row">
<asp:Label runat="server" CssClass="label">Name:</asp:Label><asp:TextBox ID="txtName" MaxLength="50" runat="server" CssClass="Field" />
<asp:RequiredFieldValidator ID="rfvName" runat="server" ErrorMessage="You must specify your …Run Code Online (Sandbox Code Playgroud) 我有两种方法.第一个动态创建一个表,然后将该表添加到PlaceHolder中.
private void generateData(){
Table tbl = new Table();
tbl.ID = "table1";
holder_info.Controls.Add(tbl);
// ...adding tr's and td's....
// ...adding CheckBox in tds....
}
Run Code Online (Sandbox Code Playgroud)
如果我在此方法中执行.FindControl("..."),我可以使用以下命令找到控件:
CheckBox check = (CheckBox)holder_info.FindControl("checkbox1");
Run Code Online (Sandbox Code Playgroud)
没关系,但不是我假装的.
在第二种方法中,我想检查用户是否检查了checkBox并做了一些事情,但我找不到控件(它总是返回null).
protected void saveInfo_Click(object sender, ImageClickEventArgs e)
{
CheckBox check = (CheckBox)holder_info.FindControl("checkbox1");
if(check.checked){ ... }
}
Run Code Online (Sandbox Code Playgroud)
此外,如果我试图找到控件"table1",我得到null.
为什么会这样?
谁能向我解释一下?
CheckBox ckRequest = new CheckBox();
ckRequest.ID = "ckRequest";
ckRequest.DataBinding += new EventHandler(this.CkIsRequested_DataBinding);
container.Controls.Add(ckRequest);
Control con = container.FindControl("ckRequest");
Run Code Online (Sandbox Code Playgroud)
调试显示 con 仍然为空。
调试还向我展示了,conteiner.Controls 有一个 ID 为“ckRequest”的项目
怎么会这样????
非常感谢您的回答。
其实我尝试以下。 findcontrol 没有在 rowUpdating 事件处理程序中找到动态创建的控件 这对我来说很有意义, findcontrol 仅适用于创建的页面。
页面的可视化树是在哪个时间点创建的?
我试图根据相关的文本框控制按钮状态.名称与前缀不同.文本框和按钮位于页面上的表格中.
<asp:Table ID="Table1" runat="server" CssClass="table">
<asp:TableRow>
<asp:TableCell Width="15%">
<asp:Label ID="lblRequestHeader" runat="server" Text="Requested" CssClass="bold text-center"
Width="90%"></asp:Label>
</asp:TableCell>
<asp:TableCell Width="15%">
<asp:Label ID="lblApprovalHeader" runat="server" Text="Approval" CssClass="bold text-center"
Width="90%"></asp:Label>
</asp:TableCell>
<asp:TableCell Width="15%">
<asp:Label ID="lblApprovalTimeHeader" runat="server" Text="Date/Time of Approval"
CssClass="bold text-center" Width="90%"></asp:Label>
</asp:TableCell>
<asp:TableCell Width="15%">
<asp:Label ID="lblReadyHeader" runat="server" Text="Ready To Pick Up" CssClass="bold text-center"
Width="90%"></asp:Label>
</asp:TableCell>
<asp:TableCell Width="15%">
<asp:Label ID="lblCollectedHeader" runat="server" Text="Collected By TestHouse" CssClass="bold text-center"
Width="90%"></asp:Label>
</asp:TableCell>
<asp:TableCell Width="15%">
<asp:Label ID="lblDeliveredHeader" runat="server" Text="Delivered From TestHouse"
CssClass="bold text-center" Width="90%"></asp:Label>
</asp:TableCell>
</asp:TableRow>
<asp:TableRow>
<asp:TableCell Width="15%">
<asp:TextBox …Run Code Online (Sandbox Code Playgroud) 我有两个嵌套的中继器。在嵌套的页脚中,我有文本框和文件上传控件。我能够毫无问题地获得文件上传的实例,但文本框的实例为空,尽管两者都放置在页脚中。
这是代表内部转发器页脚的 aspx 部分:
<FooterTemplate>
<tr class="add_comment">
<td>Add comment </td>
</tr>
<tr>
<td>
<asp:TextBox runat="server" Columns="20" Rows="3" ID="comment_txt" TextMode="MultiLine" Width="60%" CssClass="new_comment" ViewStateMode="Inherit"></asp:TextBox>
</td>
</tr>
<tr class="add_comment">
<td>
<asp:FileUpload ID="uploadImageBtn" runat="server" Text="Add image" OnClick="uploadImage" CssClass="comment_buttons" />
<asp:Button ID="comment_btn" runat="server" OnClick="submitComment" Text="Comment" CssClass="comment_buttons" />
</td>
</tr>
</table>
</FooterTemplate>
Run Code Online (Sandbox Code Playgroud)
这是我尝试访问控件的 C# 代码:
protected void commentsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Footer ))
{
Repeater childRepeater = (Repeater)sender;
TextBox commentTextBox = (TextBox)e.Item.FindControl("comment_txt");
String postText = commentTextBox.Text.ToString();
FileUpload upFile = (FileUpload)e.Item.FindControl("uploadImageBtn");
}
} …Run Code Online (Sandbox Code Playgroud) asp.net ×10
findcontrol ×10
c# ×7
master-pages ×2
.net ×1
controls ×1
formview ×1
hyperlink ×1
inheritance ×1
null ×1
repeater ×1