前台页面:
<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值写成固定的就能找到,不知道是什么原因?请高手给看看啊!
你这样写是无法获取的。为何不固定控件ID值?你这里要实现的功能完全可以固定控件ID,没必要用动态的
我这里是循环,ID值不能一样。
@一生三做: 可以的,他会智能改掉你的ID的,你稍等我去找代码
不用动态的,那有什么好的方法吗?
@一生三做:
<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: 我试一试,代码还没有看得太明白
@CrazyJinn: 不了意思,水平有限。
<cc1:BaseRepeater ID="rptList" runat="server">
</cc1:BaseRepeater>这个在我机子上会报错
@一生三做: 不要直接拷代码,BaseRepeater我这重载过的。我仔细看看你的代码
@CrazyJinn: 你的这种方法不行,因为我是主要是控制panel的显示和隐藏,单独找到行里的控件没有意义
<ItemTemplate>
<asp:Panel id ="ppp" runat="server">
</asp:Panel>
</ItemTemplate>
Control p = e.Item.FindControl('ppp' ); //这里获取到的是所有的Panel,然后根据某个条件设置隐藏就可以了
if (设置为隐藏的条件)
{
p.Visible = false;
}
希望这样写你能看得懂
@一生三做: 为什么ID不能一样啊??
@王凌志: 控件ID怎么可以相同
@CrazyJinn: 你的意思是所有的东西都包括在这一个panel里。panel是在DataList的ItemTemplate中,是在ItemTemplate中判断是否需要隐藏,给panel一个动态id主要是不为了ID不重复,好控制生成的第一数据项的显示与隐藏,不知道你明白我的意思了没有。
@一生三做: 重点是即使你写成<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: 看得不是太明白,不过其实我的程序思路是这样的。页面中有一个GridView控件中嵌套了一个DataList控件,这是做的一个菜单列表。实际上把数据绑定后对数据做一个判断,有权限就显示,没有权限就隐藏。只要实现显示与隐藏就可以了。在后台控制的时候id肯定是动态的才行。不然绑定第行的时候都成一样的了。
@一生三做: 发个图就明白了:
@一生三做: 我认为你想实现的效果用我描述的方法可以实现,你再试试吧,祝问题解决
@CrazyJinn: 我在想想,谢了
id ="p<%#Eval("innerID")%>"改成id ='p<%#Eval("innerID")%>'
另一种方法:直接获取那一列就可以了。
不行,会报错,提示不是有效标识符
@一生三做: id ='<%#"p"+Eval("innerID")%>'
如果不行,就用第二种方法。不用获取控件,直接获取那一列也可以的。
@荒野的呼唤: 获取列没有用啊,我主要是控制panel隐藏与显示
主要还是要看你的动态的id生成的是不是正确。
ID没有问题,正确的
@一生三做: e.Item.FindControl('p'+menuid ); 这个你保证 'p'+menuid 跟你的动态的id是一样的?
试一下 e.Item.FindControl("p"+menuid );
@chenping2008: 谢谢,问题不在引号这里。我都调试过了。生成的值跟页面是一样的。只要把页面换成固定的就可以在后台找到,动态就不行。
@一生三做: 或者你可以试试,在itemdatabing结束以后中这个事情,你的都是在数据绑定的时候做这个事情,是不是那个时候还没有id的生成。
如果一行里面没有两个相同的Panel,那么Panel实用一个固定的ID就可以了,不用像现在这样动态,生成HTML的时候Panel会根据行号生成的,所以Name和ID重名的问题不用担心.
你说的没错,是我想复杂了
Id就用固定值就可以实现了。走了不少弯路
想我早上和你说了那么久……你终于明白了
@CrazyJinn: 我现在实现的方式跟你说的方式应该是一样的。只是我自己想的太多了。你挺热心的,分就给你吧。谢谢大家了。我结贴了!