Стиль GridView на основе связанных данных - PullRequest
1 голос
/ 30 апреля 2010

Мне бы хотелось, чтобы строки моего GridView имели зачеркивание на основе значения связанных данных, называемого IsObsolete. Я пытался сделать это:

<RowStyle BackColor="#EFF3FB" Font-Strikeout='<%# Bind('IsObsolete') %>' />

Но, очевидно, это не разбирает. Я бы предпочел не делать этого в GridView.DataBound (). Есть другие идеи?

Ответы [ 2 ]

1 голос
/ 01 мая 2010

Я делаю это, применяя стиль к событию DataBinding одного из моих элементов управления в шаблоне. Пример:

<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="SomeTitle">
            <ItemTemplate>
                <asp:HyperLink ID="hrefYourLink" runat="server"
                    NavigateUrl="Somepage.aspx?id={0}" 
                    OnDataBinding="hrefYourLink_DataBinding"></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Затем реализуйте событие OnDataBinding:

protected void hrefYourLink_DataBinding(object sender, System.EventArgs e)
{            
    HyperLink link = (HyperLink)(sender);
    GridViewRow row = (GridViewRow)(link.Parent.Parent);
    if ((bool)(Eval("IsObsolete"))
    {
        row.CssClass = "StrikeThroughStyle";
    }
    link.Text = HttpUtility.HtmlEncode(((int)(Eval("ID"))).ToString());
    link.NavigateUrl = string.Format(link.NavigateUrl, Eval("ID").ToString());
}

Это всего лишь быстрый пример со столбцом со ссылкой, которая также модифицируется на основе привязки данных, но вы сможете понять суть ее настройки в соответствии с вашими потребностями. Мне нравится делать это на привязке данных, потому что я не выполняю привязку в своем коде aspx.

0 голосов
/ 01 мая 2010

Поскольку элемент RowStyle применим ко всей сетке, единственный способ выполнить то, что вы хотите, - это установить TemplateItems для всех столбцов и применить CssClass к каждому столбцу на основе того же значения данных.

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

Вы также можете попробовать использовать функцию форматирования и стили элементов. Воровать кусок кода сверху и изменить его:

<%

public string GetObsoleteClass(string obsolete)
{
    bool obs = Convert.ToBoolean(obsolete);
    obs ? return "myObsoleteClass" : return "myNotObsoleteClass";
}

%>
<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="SomeTitle">
            <ItemTemplate>
                <asp:HyperLink ID="hrefYourLink" runat="server"
                    NavigateUrl="Somepage.aspx?id={0}" 
                    OnDataBinding="hrefYourLink_DataBinding"></asp:HyperLink>
            </ItemTemplate>
              <itemstyle CssClass='<%# Eval("isObsolete") %>'>
              </itemstyle>
        </asp:TemplateField>
        <asp:boundfield
            sortexpression="LastName"
            datafield="LastName"
            headertext="LastName">
              <itemstyle CssClass='<%# Eval("isObsolete") %>'>
              </itemstyle>
        </asp:boundfield>
    </Columns>
</asp:GridView>
...