2

I am trying to figure out how to bring my selected rows to the top of the grid. Very important is that I am using the DevExpress Asp.Net MVC GridView.

I have the following, which is my best attempt at mashing together literally dozens of non-solutions. Please note the comments:

settings.Columns.Add("customsort").Settings.SortMode =  
DevExpress.XtraGrid.ColumnSortMode.Custom;

settings.CustomColumnSort += (sender, e) => {

    if (e.Column.FieldName == "customsort")
    {
        //these following two lines are supposed to work according to the DX support team, but there is no "grid" object
        bool isRow1Selected = grid.Selection.IsRowSelectedByKey(e.GetRow1Value(grid.KeyFieldName));
        bool isRow2Selected = grid.Selection.IsRowSelectedByKey(e.GetRow2Value(grid.KeyFieldName));
    }

    e.Handled = isRow1Selected != isRow2Selected;
    if (e.Handled)
    {
        //I don't even know whether this is right
        e.Result = isRow1Selected ? 1 : -1;
    }
};

In short, I need to put selected rows on top, but I don't know how to get the selected state of the two rows or columns I'm comparing.

DevEx version is 15.1

UPDATE: code sample:

settings.Columns.Add(column =>
        {
            //column.FieldName = "customsort";
            column.FieldName = "customsort";
            column.Caption = "customsort";

            column.ColumnType = MVCxGridViewColumnType.Default;
            //column.UnboundType = DevExpress.Data.UnboundColumnType.Integer;
            column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;


        });



        settings.CustomColumnSort += (sender, e) =>
        {
            var grid = (MVCxGridView)sender;

            if (e.Column.FieldName == "customsort")
            {

                bool isRow1Selected = grid.Selection.IsRowSelectedByKey(e.GetRow1Value(grid.KeyFieldName));
                bool isRow2Selected = grid.Selection.IsRowSelectedByKey(e.GetRow2Value(grid.KeyFieldName));

                e.Result = isRow2Selected.CompareTo(isRow1Selected);
                e.Handled = true;
            }
        };

If I click on the "customsort" column, it does perform a postback, but the sort order does not change. So at least I'm getting somewhere, but I'm not quite there yet.

4

2 回答 2

1

您有几个选项可用于解决您的特定问题。

您需要将sender对象转换MVCxGridView为 才能访问您尝试使用的属性。

settings.CustomColumnSort += (sender, e) => {
    var grid = (MVCxGridView)sender;

    if (e.Column.FieldName == "customsort") {            
        bool isRow1Selected = grid.Selection.IsRowSelectedByKey(e.GetRow1Value(grid.KeyFieldName));
        bool isRow2Selected = grid.Selection.IsRowSelectedByKey(e.GetRow2Value(grid.KeyFieldName));

        e.Result = isRow2Selected.CompareTo(isRow1Selected);
        e.Handled = true;
    }
};

您可以完全放弃grid变量,只关注自定义列。

settings.CustomColumnSort += (sender, e) => {
    var columnName = "customsort";        
    if (e.Column.FieldName == columnName) {            
        var c1 = Convert.ToBoolean(e.GetRow1Value(columnName));
        var c2 = Convert.ToBoolean(e.GetRow2Value(columnName));
        e.Result = c2.CompareTo(c1);
        e.Handled = true;
    }
};

现在这里的假设是您的自定义排序列是一种Boolean类似于复选框的类型。

最后,使用该Boolean列运行,您可以走最简单的路线,并通过将排序设置为降序将选中的列设置为显示在顶部。(真 = 1,假 = 0)

settings.Columns.Add("ColumnName").SortOrder = DevExpress.Data.ColumnSortOrder.Descending;

以下资源可能很有用。

看看这个行选择

看看这个进行排序

于 2016-05-13T03:14:37.553 回答
1

我向 DevExpress 的支持团队提出了这个问题。他们的反馈是,就我而言,我使用的数据库服务器模式不支持自定义排序。因此,我的代码是正确的,因为如果一个人不使用服务器模式,这就是实现自定义排序的方式。

希望这可以帮助某人并节省他们几个小时的调试时间。

于 2016-07-05T07:02:58.057 回答