2

そのため、リンクを表示するユーザーコントロールがあり、現在アクティブなリンクの色を変更したいと思います。これは、usercontrolascxファイルの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

ページ上の実際のは、 ASP.NETページライフサイクル<div>のレンダリング状態中に生成されます。これは、コントロールイベント処理段階の後に発生します。したがって、ハンドラー関数中にHTMLに加えた変更は、コントロールのHTMLがテンプレートから再生成されるため、レンダリング中に事実上元に戻されます。この場合、コントロールに内部HTMLを変更させるには、コントロールのオーバーライドされたRender関数に更新コードを配置します。MSDNには、レンダリング関数の記述方法の例があります。

于 2012-06-28T20:44:28.453 に答える
1

そこで、ListViews ItemDataBoundイベントハンドラーを定義し、そこにcssクラスを割り当てることで、問題を解決しました。以前の問題は、コントロールがupdatePanels内にあるため、ItemDataBoundイベントが発生していなかったことです。クリックメソッド内で「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 に答える