Стиль GridView на основе связанных данных
Я бы хотел, чтобы строки моего GridView имели зачеркивание на основе значения связанных данных, называемого IsObsolete. Я пытался сделать это:
<RowStyle BackColor="#EFF3FB" Font-Strikeout='<%# Bind('IsObsolete') %>' />
Но, очевидно, это не анализирует. Я бы предпочел не делать этого в GridView.DataBound(). Есть другие идеи?
2 ответа
Я делаю это, применяя стиль на 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.
Поскольку элемент 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>