如何在使用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 ?谢谢你。
这可能对你有帮助。
前面的代码
<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";
}