C# 在代码隐藏中更改用户控件css类

C# 在代码隐藏中更改用户控件css类,c#,asp.net,user-controls,C#,Asp.net,User Controls,因此,我有一个显示链接的用户控件,我想更改当前活动链接的颜色。 这是usercontrol ascx文件的ListView中的代码 <asp:ListView ID="sidebarListView" runat="server" DataKeyNames="Id" DataSourceID="SqlDataSourceSidebar" OnItemCommand="sidebarListView_ItemCommand"> <ItemTemplate> <di

因此,我有一个显示链接的用户控件,我想更改当前活动链接的颜色。 这是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>
....

....
单击linkbutton时,我需要更改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 ) );
}
private void SideBar1\u ItemCommand(对象发送方,事件参数e){
Int32 facId=Sidebar1.FacultyId;
SqlDataSource1.SelectCommand=“选择[Id]、[Name]、[Faculty\u Id]、[User\u Id]、[Author]、[Picture]、[Location]FROM[Books],其中[Faculty\u Id]=“+facId+”按[DateAdded]描述排序;
HtmlGenericControl htmlDivControl=(HtmlGenericControl)FindControlRecursive(Sidebar1,“sidebarItemID”);
添加(“类”,“sidebarItemActive”);
字符串newClass=htmlDivControl.Attributes[“class”];
//Write(String.Format(“alert({0}”);”,newClass));
}
这将根据用户控件中单击的链接的ID正确更改sqlDataSource。然而,课程没有改变

如果我取消对Response.Write(…)部分的注释,它会正确地发出一个警告,显示“sidebarItemActive”,因此它会正确地从我的页面中找到控件,并将其类属性指定为“sidebarItemActive”,但如果我在浏览器中查看页面源,页面上没有任何更改,它会说该类仍然是“sidebarItem”。
这里发生了什么导致更改未生效?

页面上的实际
是在页面的呈现状态期间生成的。这发生在控件事件处理阶段之后,因此在处理程序函数期间对HTML所做的任何更改都将在呈现期间有效撤消,因为控件的HTML将从模板中重新生成。在这种情况下,要使控件更改其内部HTML,可以将更新代码放入控件的重写呈现函数中。MSDN有一个关于如何编写渲染函数的详细说明。

因此我通过定义ListViews ItemDataBound事件处理程序并在其中分配css类解决了这个问题。以前的问题是,由于我的控件位于UpdatePanel内,因此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();
}

在my user 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";
     }
  }

也许该属性已经存在,添加该属性不会如您所愿生效?尝试
htmlDivControl.Attributes[“class”]=“sidebarItemActive”编辑:这实际上可能不起作用。检查页面上div的ID是否为sidebarItemID,因为控件可以将它们的控件名附加到ID中。我尝试了,同样的事情。此外,据我所知,Add的作用与Put相同,因此如果已经设置了,它将替换该值。在页面上,ID确实不是“SidebarItemID”,而是“sidebar\u Sidebar1\u sidebarListView\u SidebarItemID\u 0”等等。但是findcontrol方法实际上是如何找到元素的呢?另外,如果我将用户控件ClientIDMode设置为静态,它仍然不起作用,但是ListView中的所有项都具有相同的ID,但是类仍然没有更改。我认为这与页面生命周期有关。回发是在呈现之前处理的,因为您正在为div使用模板,所以实际的边栏div集是在处理代码之后创建的。尝试在控件渲染时执行此操作。如果这像我希望的那样有效,我会把它作为答案提交。嗯,我不确定我是否理解。基本上,我不能在控件的呈现上这样做,因为当呈现控件时,我不需要更改类。我需要在用户单击控件中的链接时更改它。我没听错吧?谢谢你的帮助