2010-04-30 99 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