首页 新闻 会员 周边

关于asp.net控件FindControl问题

0
悬赏园豆:100 [已解决问题] 解决于 2012-08-01 08:39

前台页面:

<asp:GridView ID="GvMenu" runat="server" AutoGenerateColumns="False"
onrowdatabound="GvMenu_RowDataBound" DataKeyNames="moduleNo"
GridLines="None" ShowHeader="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<h1 class="type"><a href="javascript:void(0)"><asp:Label ID="LbMenu" runat="server" Text='<%# Bind("moduleName") %>'></asp:Label></a></h1>
<div class="content">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td><img src="images/menu_topline.gif" width="182" height="5" /></td></tr>
</table>
<ul class="MM">
<asp:DataList ID="DlMenu" runat="server" onitemdatabound="DlMenu_ItemDataBound" >
<ItemTemplate>
<asp:Panel id ="p<%#Eval("innerID")%>" runat="server">
<li><a href="<%#Eval("url")%>" target="right"><%#Eval("funcName")%></a>
</li>
<asp:HyperLink id="HlfuncNo" Text='<%# DataBinder.Eval(Container.DataItem, "funcNo") %>' runat="server" Visible="false" />
<asp:Literal ID="LtinnerID" runat="server" Text='<%#Eval("innerID")%>' Visible="false"></asp:Literal>
</asp:Panel>
</ItemTemplate>

</asp:DataList>
</ul>
</div>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

 

 

后台代码:

 

protected void DlMenu_ItemDataBound(object sender, DataListItemEventArgs e)
{

HyperLink hlfuncNo = (HyperLink)e.Item.FindControl("HlfuncNo");
string funcNo = hlfuncNo.Text.ToString();
//当前列表值:funcNo
//用户权限值:ViewState["user_priv"]
//if (hlfuncNo == null)
//{
// Response.Write("<script language='javascript'>alert('当前对象为空');" + hlfuncNo + "</script>");
//}
//else
//{

// Response.Write("<script language='javascript'>alert('当前列表值:" + Convert.ToInt32(ViewState["user_priv"].ToString()) + "');</script>");

//}
//Response.Write("<script language='javascript'>alert('123:');" + Convert.ToInt32(funcNo.ToString()) + "</script>");
int a = Convert.ToInt32(ViewState["user_priv"].ToString());//拥有的值
int b = Convert.ToInt32(funcNo.ToString()); //当前列表值:
int c = a & b;
Literal Ltmenuid = (Literal)e.Item.FindControl("LtinnerID");
string menuid = Ltmenuid.Text.ToString(); //找到当前列表ID;
if (c != b)
{
//menuid.Style["Display"] = "None"; //隐藏;

Control p = e.Item.FindControl('p'+menuid );
// p.Visible = false;

//隐藏<li>
}
//获得li的ID
//判断是否为真
//是否隐藏
}

 

Control p = e.Item.FindControl('p'+menuid );这个方法找不到如终找不到页面那个asp:Panel 控件,如果把页面asp:Panel 控件ID值写成固定的就能找到,不知道是什么原因?请高手给看看啊!

一生三做的主页 一生三做 | 初学一级 | 园豆:105
提问于:2012-07-31 09:07
< >
分享
最佳答案
0

你这样写是无法获取的。为何不固定控件ID值?你这里要实现的功能完全可以固定控件ID,没必要用动态的

收获园豆:100
CrazyJinn | 小虾三级 |园豆:799 | 2012-07-31 09:14

我这里是循环,ID值不能一样。

一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:20

@一生三做: 可以的,他会智能改掉你的ID的,你稍等我去找代码

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 09:21

不用动态的,那有什么好的方法吗?

一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:22

@一生三做: 

    <cc1:BaseRepeater ID="rptList" runat="server">
        <ItemTemplate>
            <tr id="row" runat="server">
                <td colspan="4" class="title">
                    <cc1:BaseHiddenField ID="hddId" runat="server" Value='<%# Eval("RaceID")%>' />
                </td>
            </tr>
                </ItemTemplate>
            </cc1:BaseRepeater>
<input id="Home1_rptList_ctl00_hddId" type="hidden" value="123" name="Home1$rptList$ctl00$hddId">

<input id="Home1_rptList_ctl01_hddId" type="hidden" value="124" name="Home1$rptList$ctl01$hddId">

可以看到,会自动在hddId前面加上前缀来保证不重复的

然后在CS里面写这句就可以获取了

至于控件前面Base什么的是因为自己重载过,不用去理就是

BaseHiddenField hddId = (BaseHiddenField)e.Item.FindControl("hddId");
CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 09:25

@CrazyJinn: 我试一试,代码还没有看得太明白

一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:38

@CrazyJinn: 不了意思,水平有限。

<cc1:BaseRepeater ID="rptList" runat="server">

</cc1:BaseRepeater>这个在我机子上会报错

一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:42

@一生三做: 不要直接拷代码,BaseRepeater我这重载过的。我仔细看看你的代码

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 09:44

@CrazyJinn: 你的这种方法不行,因为我是主要是控制panel的显示和隐藏,单独找到行里的控件没有意义

一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:49

<ItemTemplate>
<asp:Panel id ="ppp" runat="server">

</asp:Panel>
</ItemTemplate>

 

 

Control p = e.Item.FindControl('ppp' );      //这里获取到的是所有的Panel,然后根据某个条件设置隐藏就可以了

if (设置为隐藏的条件)
{

p.Visible = false;

}

 

希望这样写你能看得懂

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 09:59

@一生三做: 为什么ID不能一样啊??

羽商宫 | 园豆:2490 (老鸟四级) | 2012-07-31 10:04

@王凌志: 控件ID怎么可以相同

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 10:06

@CrazyJinn: 你的意思是所有的东西都包括在这一个panel里。panel是在DataList的ItemTemplate中,是在ItemTemplate中判断是否需要隐藏,给panel一个动态id主要是不为了ID不重复,好控制生成的第一数据项的显示与隐藏,不知道你明白我的意思了没有。

一生三做 | 园豆:105 (初学一级) | 2012-07-31 10:24

@一生三做: 重点是即使你写成<asp:Panel id ="ppp" runat="server"> </asp:Panel>这样也是不重复的。在生成页面的时候会自动在前面加上前缀。你可以仔细看我之前贴的代码

<input id="Home1_rptList_ctl00_hddId" type="hidden" value="123" name="Home1$rptList$ctl00$hddId">

<input id="Home1_rptList_ctl01_hddId" type="hidden" value="124" name="Home1$rptList$ctl01$hddId">

ID是不重复的,即使<cc1:BaseHiddenField ID="hddId" runat="server" Value='<%# Eval("RaceID")%>' />我已经指定了ID="hddId",但是在编译的时候会动态加上前缀,不必担心ID重复

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 10:34

@CrazyJinn: 看得不是太明白,不过其实我的程序思路是这样的。页面中有一个GridView控件中嵌套了一个DataList控件,这是做的一个菜单列表。实际上把数据绑定后对数据做一个判断,有权限就显示,没有权限就隐藏。只要实现显示与隐藏就可以了。在后台控制的时候id肯定是动态的才行。不然绑定第行的时候都成一样的了。

一生三做 | 园豆:105 (初学一级) | 2012-07-31 10:37

@一生三做: 发个图就明白了:

一生三做 | 园豆:105 (初学一级) | 2012-07-31 10:41

@一生三做: 我认为你想实现的效果用我描述的方法可以实现,你再试试吧,祝问题解决

CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 11:00

@CrazyJinn: 我在想想,谢了

一生三做 | 园豆:105 (初学一级) | 2012-07-31 11:21
其他回答(4)
0

id ="p<%#Eval("innerID")%>"改成id ='p<%#Eval("innerID")%>'

另一种方法:直接获取那一列就可以了。

悟行 | 园豆:12559 (专家六级) | 2012-07-31 09:15

不行,会报错,提示不是有效标识符

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:19

@一生三做: id ='<%#"p"+Eval("innerID")%>'

如果不行,就用第二种方法。不用获取控件,直接获取那一列也可以的。

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2012-07-31 09:20

@荒野的呼唤: 获取列没有用啊,我主要是控制panel隐藏与显示

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:41
0

主要还是要看你的动态的id生成的是不是正确。

chenping2008 | 园豆:9836 (大侠五级) | 2012-07-31 09:31

ID没有问题,正确的

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:33

@一生三做: e.Item.FindControl('p'+menuid );  这个你保证 'p'+menuid 跟你的动态的id是一样的?

试一下 e.Item.FindControl("p"+menuid );

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-07-31 09:41

@chenping2008: 谢谢,问题不在引号这里。我都调试过了。生成的值跟页面是一样的。只要把页面换成固定的就可以在后台找到,动态就不行。

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-07-31 09:52

@一生三做: 或者你可以试试,在itemdatabing结束以后中这个事情,你的都是在数据绑定的时候做这个事情,是不是那个时候还没有id的生成。

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-07-31 21:46
0

如果一行里面没有两个相同的Panel,那么Panel实用一个固定的ID就可以了,不用像现在这样动态,生成HTML的时候Panel会根据行号生成的,所以Name和ID重名的问题不用担心.

Tom.汤 | 园豆:3028 (老鸟四级) | 2012-07-31 12:45

你说的没错,是我想复杂了

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-08-01 08:36
0

Id就用固定值就可以实现了。走了不少弯路

一生三做 | 园豆:105 (初学一级) | 2012-07-31 14:47

想我早上和你说了那么久……你终于明白了

支持(0) 反对(0) CrazyJinn | 园豆:799 (小虾三级) | 2012-07-31 17:02

@CrazyJinn: 我现在实现的方式跟你说的方式应该是一样的。只是我自己想的太多了。你挺热心的,分就给你吧。谢谢大家了。我结贴了!

支持(0) 反对(0) 一生三做 | 园豆:105 (初学一级) | 2012-08-01 08:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册