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);会有未将对象引用设置到对象的实例的异常 展开
<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);会有未将对象引用设置到对象的实例的异常 展开
展开全部
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();
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();
展开全部
Repeater1是套有多层控件的,
你可以这样获取其中的控件,
例如:要获取第一个重复项的LinkButton
LinkButton lb =Repeater1.Controls[0].Controls[1] as LinkButton;
第二个Controls之所以要从1起是因为RepeaterItem内部的各个服务器控件之间是有LiteralControl分隔的。
所以如果一个RepeaterItem内如果要获取第二个控件的话那就是Repeater1.Controls[0].Controls[3]了。
你可以这样获取其中的控件,
例如:要获取第一个重复项的LinkButton
LinkButton lb =Repeater1.Controls[0].Controls[1] as LinkButton;
第二个Controls之所以要从1起是因为RepeaterItem内部的各个服务器控件之间是有LiteralControl分隔的。
所以如果一个RepeaterItem内如果要获取第二个控件的话那就是Repeater1.Controls[0].Controls[3]了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
repeater是一个集合显示的数据,你这样是不行了,不能直接FindControl()
先要给repeater定义一个事件,好像叫rowcommand事件,这样也不用findControl 那个参数e的CommandSource就可以了
先要给repeater定义一个事件,好像叫rowcommand事件,这样也不用findControl 那个参数e的CommandSource就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Repeater1
你需要些个循环对没行
便利!
你需要些个循环对没行
便利!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的查找要具体到哪个linkbutton,reapter是重复显示的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询