所以我有一个显示链接的用户控件,我想更改当前活动链接的颜色。 这是我的usercontrol ascx文件的ListView中的代码。
<asp:ListView ID="sidebarListView" runat="server" DataKeyNames="Id" DataSourceID="SqlDataSourceSidebar" OnItemCommand="sidebarListView_ItemCommand">
<ItemTemplate>
<div id="sidebarItemID" class="sidebarItem" runat="server">
<div>
<asp:LinkButton ID="NameLabel" runat="server" Text='<%# Eval("Name") %>' CommandName="Select" CommandArgument='<%# Eval("Id") %>' />
</div>
</div>
</ItemTemplate>
....
单击链接按钮时,我需要更改sidebarItemID类。 我的default.aspx代码背后是这样的:
private void SideBar1_ItemCommand ( object sender , EventArgs e ) {
Int32 facId = Sidebar1.FacultyId;
SqlDataSource1.SelectCommand = "SELECT [Id], [Name], [Faculty_Id], [User_Id], [Author], [Picture], [Location] FROM [Books] WHERE [Faculty_Id]=" + facId + " ORDER BY [DateAdded] DESC";
HtmlGenericControl htmlDivControl = (HtmlGenericControl) FindControlRecursive( Sidebar1 , "sidebarItemID" );
htmlDivControl.Attributes.Add("class", "sidebarItemActive");
string newClass = htmlDivControl.Attributes["class"];
//Response.Write( String.Format( "<script>alert('{0}');</script>" , newClass ) );
}
这会根据用户控件中单击的链接的ID正确更改sqlDataSource。但是课程没有改变。
如果我取消注释Response.Write(...)部分,它会正确地发出一个警告“sidebarItemActive”,以便它从我的页面中正确找到控件并将其class属性指定为“sidebarItemActive”,但页面上没有任何更改如果我在浏览器中查看页面源,则说该类仍然是“sidebarItem”。 这里发生了什么变化没有生效?
答案 0 :(得分:1)
页面上的实际<div>
是在ASP.NET Page Life Cycle的呈现状态期间生成的。这发生在Control事件处理阶段之后,因此在处理程序函数期间对HTML所做的任何更改都会在Render期间有效撤消,因为控件的HTML是从模板重新生成的。要在这种情况下让控件更改其内部HTML,您可以将更新代码放在一个覆盖的Render函数中以供控件使用。 MSDN有example如何编写渲染函数。
答案 1 :(得分:1)
所以我通过定义ListViews ItemDataBound事件处理程序并在那里分配css类来解决问题。之前的问题是,由于我的控件位于updatePanels内,因此ItemDataBound事件未触发。我不得不在click方法中手动调用“DataBind()”。
在我的default.aspx
中// Exposed click event, updates RecentBooks control sqlDataSource.
private void SidebarItems1_Clicked ( object sender , EventArgs e ) {
RecentBooks1.updateDataSource( SidebarItems1.FacultyId.ToString() );
SidebarItems1.DataBind();
}
在我的用户control.ascx
中protected void sidebarListView_ItemDataBound ( object sender , ListViewItemEventArgs e ) {
LinkButton button = e.Item.FindControl( "NameLabel" ) as LinkButton;
if (FacultyName != null && button != null) {
if ( button.Text == FacultyName ) {
button.CssClass = "sidebarItemActive";
}
}