2013-06-28 37 views
1

我遇到一個問題,一個GridView,當我那種GridView控件的RowDataBound事件中以編程方式更改的超鏈接控件的Text和NavigateUrl屬性。 HyperLink控件位於TemplateField中。在GridView初始加載時,Text和NavigateURL屬性按預期顯示,但在排序時,包含HyperLink控件的單元格的順序不會與GridView中的其他數據一起更改。 GridView的其餘部分按預期進行排序,但所討論的TemplateField似乎不會移動。場未排序

我懷疑RowDataBound事件沒有在排序時觸發,但我不知道該從哪裏去。我不使用的SqlDataSource由於SQL Server 2000中

這裏是GridView控件:

<asp:GridView ID="gvOpenOrders" runat="server" CssClass="gridview" AutoGenerateColumns="false" AllowSorting="true" OnSorting="gvOpenOrders_Sorting" OnRowDataBound="gvOpenOrders_RowDataBound"> 
    <AlternatingRowStyle CssClass="altrow" /> 
    <Columns> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <asp:LinkButton ID="lbSO" runat="server" CommandName="Sort" CommandArgument="csono" Text="SO"></asp:LinkButton> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <asp:HyperLink ID="hlSO" runat="server"><%# Eval("csono") %></asp:HyperLink> 
      </ItemTemplate> 
      <ItemStyle CssClass="ta-center" /> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <asp:LinkButton ID="lbCustno" runat="server" CommandName="Sort" CommandArgument="ccustno" Text="Cust No."></asp:LinkButton> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <%# Eval("ccustno") %> 
      </ItemTemplate> 
      <ItemStyle CssClass="ta-center" /> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

這是怎麼了數據綁定在GridView在Page_Load中,如果(的IsPostBack!):

private void BindGridView() 
{ 
    string sqlOpenSO; 
    string sortDirection = "", sortExpression = ""; 
    sqlOpenSO = // SQL query goes here (removed for post) 

    using (SqlDataAdapter sda = new SqlDataAdapter(sqlOpenSO, connectionString)) 
    { 
     sda.Fill(ds); 
     if (ds.Tables.Count > 0) 
     { 
      DataView dv = ds.Tables[0].DefaultView; 
      if (ViewState["SortDirection"] != null) 
      { 
       sortDirection = ViewState["SortDirection"].ToString(); 
      } 
      if (ViewState["SortExpression"] != null) 
      { 
       sortExpression = ViewState["SortExpression"].ToString(); 
       dv.Sort = string.Concat(sortExpression, " ", sortDirection); 
      } 

      gvOpenOrders.DataSource = dv; 
      gvOpenOrders.DataBind(); 
     } 
    } 
} 

使用以下OnSorting方法:

protected void gvOpenOrders_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    if (ViewState["SortDirection"] == null || ViewState["SortExpression"].ToString() != e.SortExpression) 
    { 
     ViewState["SortDirection"] = "ASC"; 
     gvOpenOrders.PageIndex = 0; 
    } 
    else if (ViewState["SortDirection"].ToString() == "ASC") 
    { 
     ViewState["SortDirection"] = "DESC"; 
    } 
    else if (ViewState["SortDirection"].ToString() == "DESC") 
    { 
     ViewState["SortDirection"] = "ASC"; 
    } 

    ViewState["SortExpression"] = e.SortExpression; 
    BindGridView(); 
} 

而下面的RowDataBound方法:

protected void gvOpenOrders_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     HyperLink hlSO = (HyperLink)e.Row.FindControl("hlSO"); 
     hlSO.NavigateUrl = "<<URL removed for post>>" + ds.Tables[0].Rows[e.Row.RowIndex]["csono"].ToString(); 
     if (!String.IsNullOrWhiteSpace(ds.Tables[0].Rows[e.Row.RowIndex]["crevision"].ToString())) 
     { 
      hlSO.Text = ds.Tables[0].Rows[e.Row.RowIndex]["csono"].ToString() + "-" + ds.Tables[0].Rows[e.Row.RowIndex]["crevision"].ToString(); 
     } 
     else 
     { 
      hlSO.Text = ds.Tables[0].Rows[e.Row.RowIndex]["csono"].ToString(); 
     } 
    } 
} 
+0

您的排序來綁定GridView之前。首先,對數據庫進行排序,然後對其進行綁定,然後纔對該行進行修改。想想如何在生命週期內重新排列你的邏輯。例如,在排序之前,對數據源中的數據進行concder修改,然後進行排序和數據綁定。 –

+0

@NikitaSilverstruk:他不排序數據源。他只綁定了GridView'if(!IsPostBack)',在排序操作的回發中,他改變Viewstate中的排序列和方向,然後根據這些值對DataSource進行排序,然後DatBind再次綁定GridView。我看不到問題。 @OP:你用調試器看看會發生什麼嗎? –

+0

@TimSchmelter,我的意思是,OP在他的'BindGridView()'方法中對DataView進行排序:'dv.Sort = string.Concat(sortExpression,「」,sortDirection);',那麼GridView被綁定並且只有這樣綁定行的值纔會改變。這裏,排序在值改變之前發生。或者我錯過了什麼?編輯:我正在瘋狂自己...不排序之前綁定在eLife週期? –

回答

0

我覺得你可以在GridView控件本身使用,而無需使用TemplateFields:

<asp:GridView ID="gvOpenOrders" runat="server" CssClass="gridview" AutoGenerateColumns="false" AllowSorting="true" OnSorting="gvOpenOrders_Sorting" OnRowDataBound="gvOpenOrders_RowDataBound"> 
      <AlternatingRowStyle CssClass="altrow" /> 
      <Columns> 
       <asp:HyperLinkField DataNavigateUrlFormatString="<<URL removed for post>>{0}{1}" 
        DataNavigateUrlFields="csono, crevision" > 

       <asp:TemplateField> 
        <HeaderTemplate> 
         <asp:LinkButton ID="lbCustno" runat="server" CommandName="Sort" 
          CommandArgument="ccustno" Text="Cust No."></asp:LinkButton> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <%# Eval("ccustno") %> 
        </ItemTemplate> 
        <ItemStyle CssClass="ta-center" /> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

排序和其他一切應該繼續本身的工作,我認爲這將避免你的排序問題。

試試吧,讓我知道它是如何工作。哦,這應該允許你擺脫OnRowDataBound中的代碼。

+0

聽起來像一個很好的建議,但我也需要做一些基於單元格數據的條件格式化,所以我需要通過代碼隱藏來處理這樣的事情(或類似的事情)。 – brainbolt