2

所以我有一个显示链接的用户控件,我想更改当前活动链接的颜色。这是我的 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”的警报,因此它会正确地从我的页面中找到控件并将其类属性分配为“sidebarItemActive”,但如果我查看,页面上没有任何变化浏览器中的页面源它说该类仍然是“sidebarItem”。这里发生了什么变化没有生效?

4

2 回答 2

1

您页面上的实际s 是在ASP.NET 页面生命周期<div>的渲染状态期间生成的。这发生在 Control 事件处理阶段之后,因此您在处理程序函数期间对 HTML 所做的任何更改都在 Render 期间有效地撤消,因为控件的 HTML 是从模板重新生成的。在这种情况下,要让控件更改其内部 HTML,您可以将更新代码放在控件的重写 Render 函数中。MSDN 有一个如何编写渲染函数的示例。

于 2012-06-28T20:44:28.453 回答
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";
     }
  }
于 2012-06-30T10:06:37.657 回答