在对 GridView 进行排序时,在 GridView 的 RowDataBound 事件期间以编程方式更改超链接控件的 Text 和 NavigateUrl 属性时遇到了问题。HyperLink 控件位于 TemplateField 中。在初始加载 GridView 时,Text 和 NavigateURL 属性按预期显示,但在排序时,包含 HyperLink 控件的单元格的顺序不会与 GridView 中的其他数据一起更改。GridView 的其余部分按预期排序,但有问题的 TemplateField 似乎没有移动。
我怀疑 RowDataBound 事件没有在排序时触发,但我不确定从这里去哪里。由于 SQL Server 2000,我没有使用 SqlDataSource。
这是网格视图:
<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>
这就是我在 Page_Load if(!IsPostBack) 中对 GridView 进行数据绑定的方式:
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();
}
}
}