GridView 排序状态下,如果不采用GridView自带的新增空白行的话,而是采用AddNewRow或者自己编写的方法,新增行因为单元格值为空,导致排序发生混乱,如果想固定住新增行始终停留在最底部,解决方案有两种:
1、利用devexpress提供一个ImmediateUpdateRowPosition属性,可以在维护的时候不排序,不分组,不过滤等。(一开始发这贴的时候没注意到,后面有人提出来了,才恍然大悟,感谢这位兄台,当然,下面的自定义排序的方式也可以作为参考);
gridView1.OptionsBehavior.ImmediateUpdateRowPosition = false;
2、自定义排序,GridView提供了CustomColumnSort的事件进行自定义排序规则
private void Form1_Load(object sender, EventArgs e)
{
var dt = new DataTable();
for (int i = 0; i < 3; i++)
dt.Columns.Add("Column" + i.ToString());
for (int i = 0; i < 4; i++)
dt.Rows.Add(new object[] { "Item" + i.ToString(), i, 3 - i });
gridControl1.DataSource = dt;
foreach (GridColumn col in gridView1.VisibleColumns)
{
col.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;//排序设置为自定义排序,否则不会触发CustomColumnSort事件
}
gridView1.VisibleColumns[0].SortOrder = DevExpress.Data.ColumnSortOrder.Ascending;
}
private void gridView1_CustomColumnSort(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnSortEventArgs e)
{ //此处取第一列作为判断依据,可以根据情况设置其他判断依据,比如ID值之类的,原理一样,目的就是让新增的行始终排在最下面。
var value1 = (e.RowObject1 as DataRowView)["Column0"].ToString();
var value2 = (e.RowObject2 as DataRowView)["Column0"].ToString();
if (value1 == "" && value2 != "")
{
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Ascending)
e.Result = 1;
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Descending)
e.Result = -1;
e.Handled = true;
}
if (value1 != "" && value2 == "")
{
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Ascending)
e.Result = -1;
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Descending)
e.Result = 1;
e.Handled = true;
}
if (value1 == "" && value2 == "")
{
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Ascending)
if (e.ListSourceRowIndex1 > e.ListSourceRowIndex2)
e.Result = 1;
else
e.Result = -1;
if (e.SortOrder == DevExpress.Data.ColumnSortOrder.Descending)
if (e.ListSourceRowIndex1 > e.ListSourceRowIndex2)
e.Result = -1;
else
e.Result = 1;
e.Handled = true;
}
}
demo 源码下载:
http://download.youkuaiyun.com/download/u012097590/9990082
效果图: