如何在使用DefaultView.Sort时在DataTable中保持一列未排序

本文关键字:排序 一列 DefaultView DataTable 时在 Sort | 更新日期: 2023-09-27 18:11:01

我有一些数据表tbl1:

 RowNumber   Column1
 ---------  --------
    1          xyz
    2          foo
    3          bar

我使用tbl1.DefaultView.Sort = "Column1 asc";,设置tbl1作为数据源到GridView,结果是:

 RowNumber   Column1
 ---------  --------
    3          bar
    2          foo
    1          xyz

我需要的是RowNumber列中的值保持原样,但Column1需要排序。这样的:

RowNumber    Column1
 ---------  --------
    1          bar
    2          foo
    3          xyz

还有一件事-我需要它在tbl1本身或GridView中完成,但不是在客户端(JavaScript),而不是在页面中嵌入代码块。对此有什么好的解决方案吗?或者我需要迭代每一个表行,并在每次使用列排序时手动设置RowNumber ?谢谢你。

如何在使用DefaultView.Sort时在DataTable中保持一列未排序

这可能对你有帮助。

前面的代码

    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="false" AllowSorting="true" OnSorting="gv_Sorting">
        <Columns>
            <asp:TemplateField HeaderText="rowNumber">
                <ItemTemplate>
                    <%# Eval("RowNo") %>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="foo" SortExpression="Foo">
                <ItemTemplate>
                    <%# Eval("Foo") %>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

背后的代码
private string _sortDirection = "";
protected void Page_Load(object sender, EventArgs e)
{
    // Check
    if (!IsPostBack)
    {
        // Varaible
        DataTable dt = new DataTable();
        String[] array = { "xyz", "foo", "bar" };
        dt.Columns.Add("Foo");
        dt.Column.Add("RowNo");
        // Loop
        for (int i = 0; i < array.Length; i++)
            dt.Rows.Add(array[i], (i + 1).ToString());
        // Check & Bind
        if (dt != null)
        {
            // ViewState
            ViewState["Data"] = dt;
            gv.DataSource = dt;
            gv.DataBind();
            // Dispose
            dt.Dispose();
        }
    }
}
protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
    // Check
    _sortDirection = ViewState["SortFoo"] != null ? ViewState["SortFoo"] + "" : "";
    SetSortDirection(_sortDirection);
    ViewState["SortFoo"] = _sortDirection;
    DataTable dt = ViewState["Data"] as DataTable;
    dt.DefaultView.Sort = e.SortExpression + " " + _sortDirection;
    // Define New DataTable
    DataTable dt1 = new DataTable();
    dt1.Column.Add("Foo");
    dt1.Column.Add("RowNo");
    // Loop
    for (int i = 0; i < dt.Rows.Count; i++) 
         dt1.Rows.Add(dt.Rows[i]["Foo"] + "", (i + 1).ToString()); 
    // Save to ViewState
    ViewState["SortFoo"] = dt1;        
    // Bind
    gv.DataSource = dt1;
    gv.DataBind();
}
private void SetSortDirection(string sortDirection)
{
    if (sortDirection == "") _sortDirection = "ASC";
    else if (sortDirection == "ASC") _sortDirection = "DESC";
    else _sortDirection = "ASC";
}