在后面的代码中更改用户控件css类

时间:2012-06-28 16:58:32

标签: c# asp.net user-controls

所以我有一个显示链接的用户控件,我想更改当前活动链接的颜色。 这是我的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”。 这里发生了什么变化没有生效?

2 个答案:

答案 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";
     }
  }