通过中继器迭代
有这个转发器……
Default <asp:LinkButton ID="lnk1" Text="Make Default" CommandName="SetDefault" runat="server" Visible="True" CommandArgument='' CausesValidation="false">
我想要的是,当用户点击转发器呈现的lsit中的任何“lnk1”链接按钮时,该链接应该被替换为标签“label1”..即,当用户点击“Make Default”链接时,它应替换为“是”标签
现在,当我点击2个链接按钮时,两个标签都显示“是”,因为我只需要一个链接按钮显示是,即已经克隆的那个,其余项目只显示“默认”链接按钮。
即只有一个项目应该显示“是”标签…现在我如何迭代转发器项目只设置一个项目作为默认值而不是多个?
您可以迭代转发器项集合,
protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e) { int selectedIndex = e.Item.ItemIndex; foreach(RepeaterItem item in myRepeater.Items) { ((LinkButton)item.FindControl("lnk1")).Visible = (item.ItemIndex != selectedIndex); ((Label)item.FindControl("label1")).Visible = (item.ItemIndex == selectedIndex); } }
此选项的优点是:1。数据库没有第二次命中。
或者我将我的逻辑放在ItemDataBound事件中,将单击的链接按钮索引存储在成员变量中,并在命令事件处理程序中调用DataBind。
private int selectedIndex = -1; //... protected void myRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e) { selectedIndex = e.Item.ItemIndex; myRepeater.DataSource = MyGetDataMethod(); myRepeater.DataBind(); }
在ItemDataBound处理程序中,将当前索引与存储的索引进行比较,如果它们匹配则显示标签。
protected void myRepeater_ItemDataBound(Object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { if(e.Item.ItemIndex == selectedIndex) { ((LinkButton)e.Item.FindControl("lnk1")).Visible = false; ((Label)e.Item.FindControl("label1")).Visible = true; } } }
第二种选择的缺点是:1。数据库的第二次命中。 2.如果用户单击说第二行,而其他一些用户插入新的地址记录,则重新绑定时第2行现在可能会有所不同。 此外,如果您没有使用订单,那么可能会在数据库调用之间进行更改,并且您存储的selectedIndex也可能会失效。
所以最后我会选择第一选择,我已经考虑过了。
- 从IIS 7/8中的静态内容中删除服务器标头
- Web API2 NinjectWebCommon.cs不会出现
- EventHandler不适用于动态控制
- 正则表达式validation不适用于ASP.Net中的中国文化
- 动态创建GridView
- ASP.net下载并保存用户文件夹中的文件
- 内存消耗.Net应用程序(Azure网站)
- 永远等待localhost!
- 如何使自定义控件可validation?
Interesting Posts