ASP.NET: установка стиля HTML-элемента программно

Я создаю меню с элементом управления Repeater, привязанным к XmlDataSource.

<asp:Repeater ID="myRepeater" runat="server" 
    DataSourceID="myDataSource" 
    onitemdatabound="myRepeater_ItemDataBound" 
    onitemcreated="myRepeater_ItemCreated">
    <HeaderTemplate>
        <ul class="menu_list">
    </HeaderTemplate>
    <ItemTemplate>
        <li id="liMenu" runat="server"><asp:HyperLink ID="hrefMenuItem" runat="server" Text='<%# XPath("@text")%>' NavigateUrl='<%# XPath("@href")%>'></asp:HyperLink></li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>
<asp:XmlDataSource runat="server" ID ="myDataSource" XPath="Menu/Items/*" EnableCaching="False" /> 

Я хотел бы иметь возможность установить стиль содержащего LI на основе событий наведения мыши и выбранного в данный момент пункта меню. Я пытался через HtmlGenericControl, но получаю сообщение об ошибке только для чтения.

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                HyperLink hrefCurrentMenuLink = e.Item.FindControl("hrefMenuItem") as HyperLink;
                HtmlGenericControl l_genericControl = e.Item.FindControl("liMenu") as HtmlGenericControl;

                if ((hrefCurrentMenuLink != null) && (l_genericControl != null))
                {
                    string l_currentPage = GetCurrentWebPage();

                    if (String.Compare(Path.GetFileNameWithoutExtension(hrefCurrentMenuLink.NavigateUrl), l_currentPage, StringComparison.OrdinalIgnoreCase) == 0)
                        l_genericControl.Style = "on-nav";
                    else
                        l_genericControl.Style = "off-nav";

                    l_genericControl.Attributes.Add("onmouseover", "navOn(this)");
                    l_genericControl.Attributes.Add("onmouseout", "navOff(this)");
                }
            }
        }

Есть ли способ сделать это?


person Bullines    schedule 03.12.2008    source источник


Ответы (3)


Свойство стиля представляет собой коллекцию. Сделай это:

l_genericControl.Style.Add("css-name", "css-value")

Или, если вы используете классы CSS, измените свойство CssClass:

l_genericControl.CssClass = "on-nav";

Если вы пытаетесь переключить класс CSS с помощью javascript, попробуйте что-то вроде этого (не проверено):

l_genericControl.Attributes.Add("onmouseover", "this.className='on-nav';");
l_genericControl.Attributes.Add("onmouseout", "this.className='off-nav';");

Если вы хотите изменить стиль с помощью javascript, это может сработать:

l_genericControl.Attributes.Add("onmouseover", "this.style.color='red'; this.style.backgroundColor='yellow';");
l_genericControl.Attributes.Add("onmouseout", "this.style.color='black'; this.style.backgroundColor='none';");
person Michael Haren    schedule 03.12.2008
comment
Кажется, я не могу получить доступ к свойству CssClass. - person Bullines; 04.12.2008
comment
Можете ли вы использовать asp: listitem внутри шаблона вашего элемента (вместо li)? - person Michael Haren; 04.12.2008
comment
Возможен ли элемент списка, если маркированный список запускается в шаблоне заголовка? - person Bullines; 04.12.2008
comment
Я думаю, что это сработает, если это позволит вам добавить его. Однако он может не разрешить это, не будучи вложенным в элемент управления коллекцией asp. - person Michael Haren; 04.12.2008

на базовом уровне вы можете сделать:

l_genericControl.Attributes["class"] = "on-nav";
person Jimmy    schedule 03.12.2008

Проблема в этой части:

l_genericControl.Style = "off-nav";

который вы можете исправить, применив вместо этого CssClass

// += to prevent overwriting a class you would set in the markup
l_genericControl.CssClass += "off-nav";
person mbillard    schedule 03.12.2008