首页新闻找找看学习计划

请教从Repeater模板中读取服务器控件的问题

0
悬赏园豆:100 [已解决问题] 解决于 2011-12-09 13:29

我要做一个.ascx,用Repeater来显示数据,这个.ascx里需要定义几个属性(因为是个公用的控件),代码如下:

View Code
 public partial class TextBoxList : System.Web.UI.UserControl
{
public string frmMstId { get; set; }
public string userObjectId { get; set; }
public string userObjectName { get; set; }
public string agentObjectId { get; set; }
public bool status
{
set
{
thIPStatus.Visible = !value;
td1IPStatus.Visible = !value;
td2IPStatus.Visible = !value;
lblIpStatus.Visible = !value;
lblstatus.Visible = !value;
lblstatus1.Visible = !value;
}
get
{
return !lblIpStatus.Visible;
}
}
public string Title
{
set
{
title.Text = value;
}
get
{
return title.Text;
}
}

但是现在的问题是,在定义这些属性时无法获取位于Repeater的HeaderTemplate和ItemTemplate中的服务器控件,比如Lable,错误如图所示:

我试过用this.rptTextBoxList.FindControl("thIPStatus")方法也不行,如:

View Code
 public bool status
{
set
{
this.rptTextBoxList.FindControl("thIPStatus").Visible = !value;
this.rptTextBoxList.FindControl("td1IPStatus").Visible = !value;
this.rptTextBoxList.FindControl("lblIpStatus").Visible = !value;
this.rptTextBoxList.FindControl("lblstatus").Visible = !value;
this.rptTextBoxList.FindControl("lblstatus1").Visible = !value;
this.rptTextBoxList.FindControl("td2IPStatus").Visible = !value;
}
get
{
return !this.rptTextBoxList.FindControl("lblIpStatus").Visible;
// return false;
}
}

 

请问有什么好的办法能实现这个需求呢?

感激不尽~~

skybirdzw的主页 skybirdzw | 初学一级 | 园豆:3
提问于:2011-10-21 19:05
< >
分享
最佳答案
1

前台代码是什么样的?

收获园豆:80
artwl | 专家六级 |园豆:16526 | 2011-10-21 19:52

前台就是.ascx普通的Repeater控件的HeaderTemplate和ItemTemplate里又嵌套了asp:Lable控件啊。

skybirdzw | 园豆:3 (初学一级) | 2011-10-22 11:41

@skybirdzw: 这样试试:

public bool status
{
set
{
this.rptTextBoxList.Controls[0].Controls[0].FindControl("thIPStatus").Visible = !value;
this.rptTextBoxList.Controls[0].Controls[0].FindControl("td1IPStatus").Visible = !value;
this.rptTextBoxList.Controls[0].Controls[0].FindControl("lblIpStatus").Visible = !value;
this.rptTextBoxList.Controls[0].Controls[0].FindControl("lblstatus").Visible = !value;
this.rptTextBoxList.Controls[0].Controls[0].FindControl("lblstatus1").Visible = !value;
this.rptTextBoxList.Controls[0].Controls[0].FindControl("td2IPStatus").Visible = !value;
}
get
{
return !this.rptTextBoxList.Controls[0].Controls[0].FindControl("lblIpStatus").Visible;
// return false;
}
}

如果解决了请快点结帖哦^^

artwl | 园豆:16526 (专家六级) | 2011-10-22 19:41

@天行健 自强不息: 恩,我周一上班回去试试,谢谢你。

 

skybirdzw | 园豆:3 (初学一级) | 2011-10-22 20:59

@天行健 自强不息: 你这样只是控制了第一行,如果是多行数据怎么办?我觉得她还是复写按行绑定事件吧,将这个代码修改一下放在按行绑定事件里面。

小小刀 | 园豆:1991 (小虾三级) | 2011-10-23 10:43

@小小刀: 不好意思,我没看明白。⊙﹏⊙b汗。。。您说的是重写按行绑定事件是指这个事件吗:

 protected void rptTextBoxList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

}

那么重写这个事件以后里面的内容改怎么写啊?麻烦请指教下,谢谢啊。

 protected override void rptTextBoxList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
?????????????????
}

感激不尽~~

 

skybirdzw | 园豆:3 (初学一级) | 2011-10-24 08:50

我再补上前台的代码吧,请两位大侠帮我看看啊:

View Code
<asp:Repeater ID="rptTextBoxList" runat="server" 
onitemdatabound="rptTextBoxList_ItemDataBound">
<HeaderTemplate>
<tr class="header">
<th class="checkbox-col">
<asp:CheckBox runat="server" ID="CheckBox2" />
</th>
<th class="seq-col">
S/No.
</th>
<th style="margin-left: 40px">
<asp:Label runat="server" ID="title" Text=""></asp:Label>
</th>
<th style="margin-left: 40px" runat="server" id="thIPStatus" visible="false">
<asp:Label ID="lblIpStatus" Text="Ip Status" visible="false" runat="server"></asp:Label></th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td class="checkbox-col">
<asp:CheckBox runat="server" ID="chklist" />
</td>
<td class="seq-col">
</td>
<td>
</td>
<td runat="server" id="td1IPStatus" visible="false">
<asp:Label Visible="false" ID="lblstatus" Text='<%#Eval("ipstatus") %>' runat="server"></asp:Label></td>
</tr>
</ItemTemplate>
</asp:Repeater>

要在页面初始化的时候找到Repeater控件的HeaderTemplate和ItemTemplate里嵌套的Lable(如:<asp:Label Text="Ip Status" visible="false" runat="server"></asp:Label>)标签和td标签(如:<td runat="server" visible="false">)并在属性里控制他们的显示状态。


 

skybirdzw | 园豆:3 (初学一级) | 2011-10-24 08:58

@天行健 自强不息: 您好。我按照您的方法试了下,结果还是不行,this.rptTextBoxList.Controls[0]找不到,截图如下:

 

skybirdzw | 园豆:3 (初学一级) | 2011-10-24 09:09

@skybirdzw: 怎么没人回答了啊?

skybirdzw | 园豆:3 (初学一级) | 2011-10-25 18:33

@小小刀: Repeater控件是有多层的,要分层才能找到,参考:http://www.cnblogs.com/605395451/archive/2011/08/04/2127743.html

另外FindControl使用方法参考:http://www.cnblogs.com/kuwoyidai/archive/2009/05/24/1488280.html

artwl | 园豆:16526 (专家六级) | 2011-10-26 09:37

@天行健 自强不息: 多谢提供的链接。

skybirdzw | 园豆:3 (初学一级) | 2011-10-27 12:23
其他回答(2)
0

我觉得后台属性是针对一个对象的,而在Repeater中的对象是多个,不太容易实现吧!可以试试遍历repeater的Control试试。

收获园豆:10
幻天芒 | 园豆:36522 (高人七级) | 2011-10-25 22:16
0

 Button btn = e.Item.FindControl("btnChongzhi") as Button;一般在Repeater1_ItemDataBound事件中使用FindControl方法可以得到这个对象,但是如果你在repeater中有几个模板的话,需要判断是在那个模板中,一般这样判断e.Item.ItemType==ListItemType.Item……这样进行判断。如果不是在Repeater1_ItemDataBound事件中的话,那你就需要遍历repeater中的控件,一个个进行循环判断了

收获园豆:10
Impossible | 园豆:70 (初学一级) | 2011-10-30 16:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册