c#datagridview排序

crecrecre 2009-02-12 04:18:28
我想在一个form里添加几排序按钮对DataGridView或DataTable进行排序,
datagridview默认的排序方式是以升序,想点击按钮时是以降序排列,而且还可以取消排序状态,如何设置?
...全文
2801 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
eric10 2012-03-26
region//自定义编程排序方式
if (e.Button == MouseButtons.Left && this.Columns[e.ColumnIndex].SortMode == DataGridViewColumnSortMode.Programmatic)
{
// 检查已经排序的列
DataGridViewColumn newColumn = this.Columns[e.ColumnIndex];
DataGridViewColumn oldColumn = this.SortedColumn;
ListSortDirection direction;

// 判断排序方式
if (oldColumn != null)
{
if (oldColumn == newColumn &&
this.SortOrder == SortOrder.Ascending)
{
direction = ListSortDirection.Descending;
}
else
{
direction = ListSortDirection.Ascending;
oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
}
}
else
{
direction = ListSortDirection.Ascending;
}

// 排序
if (newColumn != null)
{
SortedList<string, DataGridViewCellStyle> st1 = new SortedList<string, DataGridViewCellStyle>();
SortedList<string, int> rowheight = new SortedList<string, int>();
SortedList<string, bool> rowSelected = new SortedList<string, bool>();
foreach (DataGridViewRow row in this.Rows)
{
string guid = null;
foreach (DataGridViewColumn col in this.Columns)
{
guid += row.Cells[col.Name].Value.ToString();
}
st1.Add(guid, row.DefaultCellStyle.Clone());
rowheight.Add(guid, row.Height);
rowSelected.Add(guid, row.Selected);
}

this.Sort(newColumn, direction);
//图标
newColumn.HeaderCell.SortGlyphDirection =direction == ListSortDirection.Ascending ?
SortOrder.Ascending : SortOrder.Descending;
//重新绑定外观
//this.DefaultCellStyle = st0;
foreach (DataGridViewRow row in this.Rows)
{
string guid = null;
foreach (DataGridViewColumn col in this.Columns)
{
guid += row.Cells[col.Name].Value.ToString();
}row.DefaultCellStyle = st1[guid];
row.Height = rowheight[guid];
回复
wisecn 2011-12-13
9楼正解。
回复
xiaoqi_xp 2009-02-13
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Descending);
回复
j45kp 2009-02-13
/// <summary>
/// 在单击某个用于对列进行排序的超链接时发生,但在 GridView 控件执行排序操作之前。此事件通常用于取消排序操作或执行自定义的排序例程。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
string sPage = e.SortExpression;
if (ViewState["SortOrder"].ToString() == sPage)
{
if (ViewState["OrderDire"].ToString() == "DESC")
ViewState["OrderDire"] = "ASC";
else
ViewState["OrderDire"] = "DESC";
}
else
{
ViewState["SortOrder"] = e.SortExpression;
}
bind();
}
回复
aini2046 2009-02-12
建议您使用DataView(数据视图)对象,此对象能对DataSet里的数据进行排序。它有两个很有用的方法:Sort()排序方法和RowsFilter(筛选)属性.您可以写一个方法,此方法的返回类型是DataView类型的。方法代码部分示例:
//创建DataView对象
DataView 对象名=new DataView();
//指定排序方式
对象名.Sort()=“列名 DESC/ASC”;
回复
sky11007 2009-02-12
非常同意楼上两位
点击升序排序按钮的时候在SQL语句加上 where order by 字段 des
点击降序排序按钮的时候在SQL语句加上 where order by 字段 asc
点击取消按钮的时候,去掉where后的条件语句
回复
flyrain521 2009-02-12
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["SortOrder"] = "身份证号码";
ViewState["OrderDire"] = "ASC";
bind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
string sPage = e.SortExpression;
if (ViewState["SortOrder"].ToString() == sPage)
{
if (ViewState["OrderDire"].ToString() == "Desc")
ViewState["OrderDire"] = "ASC";
else
ViewState["OrderDire"] = "Desc";
}
else
{
ViewState["SortOrder"] = e.SortExpression;
}
bind();
}

public void bind()
{

string sqlstr = "select top 5 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
DataView view = myds.Tables["飞狐工作室"].DefaultView;
string sort = (string)ViewState["SortOrder"] + " " + (string)ViewState["OrderDire"];
view.Sort = sort;
GridView1.DataSource = view;
GridView1.DataBind();
sqlcon.Close();
}
}

前台主要代码:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
CellPadding="3" Font-Size="9pt" OnSorting="GridView1_Sorting" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px">
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:BoundField DataField="身份证号码" HeaderText="用户ID" SortExpression="身份证号码" />
<asp:BoundField DataField="姓名" HeaderText="用户姓名" SortExpression="姓名"/>
<asp:BoundField DataField="员工性别" HeaderText="性别" SortExpression="员工性别"/>
<asp:BoundField DataField="家庭住址" HeaderText="家庭住址" SortExpression="家庭住址"/>

</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>


该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=15602&ArticlePage=2
回复
Dobzhansky 2009-02-12
排序可以调用 DataGridView 的排序函数

void
Sort (
DataGridViewColumn dataGridViewColumn,
ListSortDirection direction
)

来进行

对于取消排序, 可以使用 BindingSource 来作为媒介,
BindingSource 有个 RemoveSort 调用.
回复
村部 2009-02-12
在不同的按钮事件中,分别对绑定的数据源,使用不同排序方法的’SQL‘语句即可。
回复
yg1925 2009-02-12
在点击按扭的事件里对数据进行排序,然后再绑定到显示数据的控件里
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.