我遇到一個問題,一個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();
}
}
}
您的排序來綁定GridView之前。首先,對數據庫進行排序,然後對其進行綁定,然後纔對該行進行修改。想想如何在生命週期內重新排列你的邏輯。例如,在排序之前,對數據源中的數據進行concder修改,然後進行排序和數據綁定。 –
@NikitaSilverstruk:他不排序數據源。他只綁定了GridView'if(!IsPostBack)',在排序操作的回發中,他改變Viewstate中的排序列和方向,然後根據這些值對DataSource進行排序,然後DatBind再次綁定GridView。我看不到問題。 @OP:你用調試器看看會發生什麼嗎? –
@TimSchmelter,我的意思是,OP在他的'BindGridView()'方法中對DataView進行排序:'dv.Sort = string.Concat(sortExpression,「」,sortDirection);',那麼GridView被綁定並且只有這樣綁定行的值纔會改變。這裏,排序在值改變之前發生。或者我錯過了什麼?編輯:我正在瘋狂自己...不排序之前綁定在eLife週期? –