2010-04-30 102 views
1

我希望我的GridView的行基于绑定数据值IsObsolete具有删除线。我试图这样做:基于绑定数据的GridView样式

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

但显然这并不解析。我宁愿不在GridView.DataBound()中执行此操作。任何其他想法?

+0

您的网格数据绑定列是动态的吗? – Myra 2010-04-30 14:27:42

+0

@CAbbott:使用ItemDataBound会相当困难,特别是因为GridView没有这个方法。 :) – 2010-04-30 14:28:50

+0

@Myra nope,从数据库使用SqlDataSource。如果他们是,这会更容易。 – 2010-04-30 14:29:07

回答

1

我通过在模板中的某个控件的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

@Matthew琼斯你有没有想过这个?如果您需要更多帮助,请发表评论或编辑您的问题,我会看到我能做些什么。 – Kelsey 2010-08-11 21:44:44

0

由于RowStyle元素适用于整个网格,要实现所需的唯一方法是为所有列设置TemplateItems,并根据相同的数据值将CssClass应用于每列。

我不确定你的理由是为了避免DataBound事件,因为这是实现它的最简单方法。

你也可以尝试使用格式化功能和itemstyles。从上方窃取一小段代码并更改它:

<% 

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> 
+0

Css可以设置在行级,不需要单独设置每个项目,除非您想重写某些内容。另外,我在DataBinding项目上执行此操作,因为我通常至少定义了其中一个,并且很少实现任何其他DataBound事件,因此只需将其添加到第一项DataBinding事件中就可以了。另外,如果你想为不同颜色的整行着色,我的方法运行良好。 – Kelsey 2010-05-01 01:03:26

+0

@凯尔西 - 这就是他想要做的 - 重写一些东西。我同意使用该事件是首选方法,但他在问题中特别指出他不想使用该事件。 – 2010-05-01 11:38:01