C# findcontrol的用法

.aspx中有如下代码:<asp:RepeaterID="Repeater1"runat="server"><ItemTemplate><tr><tdstyle="wid... .aspx中有如下代码:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr>
<td style="width: 30%">
<a href="../View.aspx?id=<%#Eval("id") %>" target="_blank"><%#Eval("Title") %></a>
</td>
<td style="width: 20%"><%#Eval("Class") %>
</td>
<td style="width: 30%"><%#Eval("Time") %>
</td>
<td style="width: 20%"><a href="EditNews.aspx?id=<%#Eval("id") %>">编辑</a>
<asp:LinkButton ID="LinkButton2" runat="server" CommandName='<%#Eval("id") %>' OnClientClick="return confirm('确定要删除吗?')" OnClick="LinkButton2_Click">删除</asp:LinkButton></td>
</tr>
</ItemTemplate>
</asp:Repeater>
在.aspx.cs中有如下代码:
LinkButton lb = Repeater1.FindControl("LinkButton2") as LinkButton;
int ID = Convert.ToInt32(lb.CommandName);
为什么我运行时对这句int ID = Convert.ToInt32(lb.CommandName);会有未将对象引用设置到对象的实例的异常
展开
 我来答
dong_1984dd
2015-08-23 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1070
采纳率:100%
帮助的人:230万
展开全部
1.FindControl的使用方法:
Control.FindControl (String):在当前的命名容器中搜索带指定 id
参数的服务器控件。(有点类似javascript中的getElementById(string))
简单的例子:
<form
id="form1" runat="server">
<div>
<asp:TextBox
ID="TextBox1" runat="server">TextBox</asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"
/>
<br />
<asp:Label ID="Label1"
runat="server"
Text="Label"></asp:Label></div>
</form>
如果需要获得页面中的"TextBox1",代码中可以使用this.TextBox1来引用,这里我们使用FindControl:

protected void Button1_Click(object
sender, EventArgs e)
{
//Control c =
this.FindControl("TextBox1");
//TextBox tb= (TextBox)c;

//FindControl返回的是一个Control类型的控件,需要强制类型转化成TextBox类型
TextBox
tb=(TextBox)this.FindControl("TextBox1");
this.Label1.Text =
tb.Text; }

当TextBox1放到其他控件里应该怎么查找呢?

<div>

<asp:Panel ID="Panel1" runat="server" Height="50px" ;125px">

<asp:TextBox ID="TextBox1"
runat="server">TextBox</asp:TextBox>
<asp:Label
ID="Label1" runat="server" Text="Label"></asp:Label>

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"
/>
</asp:Panel>
</div>

当TextBox1放到Panel里,似乎没什么影响 TextBox
tb=(TextBox)this.FindControl("TextBox1"),当查看生存页

面的HTML代码是发现,TextBox的ID并没有改变,所以可以获得TextBox1。

<div>

<div
id="Panel1" style="height:50px;;">

<input name="TextBox1"
type="text" value="TextBoxdsd" id="TextBox1" />
<span
id="Label1">TextBoxdsd</span>
<input type="submit"
name="Button1" value="Button" id="Button1" />

</div>
</div>

当TextBox1放到DataGrid中
<asp:DataGrid
ID="dg1" runat="server"
OnSelectedIndexChanged="dg1_SelectedIndexChanged">

<Columns>
<asp:TemplateColumn>

<ItemTemplate>
<asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox>

</ItemTemplate>
</asp:TemplateColumn>

<asp:ButtonColumn CommandName="Select"
Text="选择"></asp:ButtonColumn>
</Columns>

</asp:DataGrid>

这时候this.FindControl("TextBox1")==null,无法获得TextBox1,查看生成页面HTML发现,页面有多个
<input
name="dg1$ctl02$TextBox1" type="text" id="dg1_ctl02_TextBox1" />
<input
name="dg1$ctl03$TextBox1" type="text" id="dg1_ctl03_TextBox1"
/>
TextBox1隐藏了,给DataGrid添加选择列,通过以下方法获得被选择行的TextBox1

protected void
dg1_SelectedIndexChanged(object sender, EventArgs e)
{
Control
c = this.dg1.Items[this.dg1.SelectedIndex].FindControl("TextBox1");

//Control c = this.dg1.SelectedItem.FindControl("TextBox1");
TextBox
tb = (TextBox)c;
tb.Text = "TextBox";

}

protected void dg1_EditCommand(object
source, DataGridCommandEventArgs e)
{
TextBox tb =
(TextBox)e.Item.FindControl("TextBox1");
this.Label1.Text =
tb.Text.ToString();
}

如果是在DataGrid的页眉和页脚:

((TextBox)this.dg1.Controls[0].Controls[0].FindControl("TextBoxH")).Text
=
"Head";
((TextBox)this.dg1.Controls[0].Controls[this.dg1.Controls[0].Controls.Count
- 1].FindControl

("TextBoxF")).Text =
"Footer";

TextBox1在Repeater中

<asp:Repeater ID="Repeater1"
runat="server" DataSourceID="SqlDataSource1"

OnItemCommand="Repeater1_ItemCommand">

<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"
Text=""></asp:TextBox><%#DataBinder.Eval

(Container.DataItem,"ProductName")%><asp:Button ID="btn"
OnClick="btn_click" runat="server"

Text="dddd" /><br />

</ItemTemplate>
</asp:Repeater>

通过按钮来获得TextBox1:

protected void btn_click(object
sender, EventArgs e)
{
//获得按钮
Button btn =
(Button)sender;
TextBox tb =
(TextBox)btn.Parent.FindControl("TextBox1");
tb.Text = "Text";

}

或者

foreach (RepeaterItem item in
this.Repeater1.Items)
{

((TextBox)item.FindControl("TextBox1")).Text = "Text2";

}

自定义控件里的TextBox1
<%@ Control
Language="C#" AutoEventWireup="true"
CodeFile="WebUserControl.ascx.cs"
Inherits="WebUserControl"
%>
<asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox>
引用<uc1:WebUserControl
ID="WebUserControl1" runat="server" />

获取TextBox1:

((TextBox)this.WebUserControl1.FindControl("TextBox1")).Text =
"userc";

模板页访问页面TextBox1

//模板页的TextBox1
TextBox
tbM = (TextBox)this.FindControl("TextBox1");

//页面中的TextBox1
TextBox tbC =
(TextBox)this.FindControl("ContentPlaceHolder1").FindControl("TextBox1");

tbC.Text = tbM.Text;

页面使用模板页的TextBox1

//模板页的TextBox1
TextBox
tbM = (TextBox)Master.FindControl("TextBox1");

//本页面的TextBox1
//错误的方法:TextBox tbC =
(TextBox)this.FindControl("TextBox1");
TextBox tbC =
(TextBox)Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");

tbM.Text = tbC.Text.ToString();
侯湛恩Pf
2009-06-01 · TA获得超过407个赞
知道小有建树答主
回答量:195
采纳率:0%
帮助的人:0
展开全部
Repeater1是套有多层控件的,
你可以这样获取其中的控件,
例如:要获取第一个重复项的LinkButton

LinkButton lb =Repeater1.Controls[0].Controls[1] as LinkButton;

第二个Controls之所以要从1起是因为RepeaterItem内部的各个服务器控件之间是有LiteralControl分隔的。
所以如果一个RepeaterItem内如果要获取第二个控件的话那就是Repeater1.Controls[0].Controls[3]了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yaji166
2009-05-31 · TA获得超过157个赞
知道小有建树答主
回答量:511
采纳率:0%
帮助的人:308万
展开全部
repeater是一个集合显示的数据,你这样是不行了,不能直接FindControl()
先要给repeater定义一个事件,好像叫rowcommand事件,这样也不用findControl 那个参数e的CommandSource就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qianthinkover
2009-05-31 · TA获得超过451个赞
知道小有建树答主
回答量:532
采纳率:0%
帮助的人:377万
展开全部
Repeater1
你需要些个循环对没行
便利!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
eye001
2009-06-01 · TA获得超过192个赞
知道小有建树答主
回答量:193
采纳率:0%
帮助的人:151万
展开全部
你的查找要具体到哪个linkbutton,reapter是重复显示的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式