1

在对 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();
        }
    }
}
4

1 回答 1

0

我认为您可以在不需要 TemplateFields 的情况下在 GridView 中本机使用它:

    <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 中的代码。

于 2013-06-28T19:35:01.850 回答