Devexpress基于所选行的MVC Gridview自定义排序

时间:2016-05-05 11:34:39

标签: asp.net-mvc devexpress-mvc

我想弄清楚如何将我选择的行带到网格的顶部。非常重要的是我使用的是DevExpress Asp.Net MVC GridView。

我有以下内容,这是我最好的尝试将数十种非解决方案混合在一起。请注意评论:

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;
    }
};

简而言之,我需要在顶部放置选定的行,但我不知道如何获得我正在比较的两行或两列的选定状态。

DevEx版本为15.1

更新:代码示例:

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;
            }
        };

如果我点击“customort”列,它会执行回发,但排序顺序不会改变。所以至少我到了某个地方,但我还没到那儿。

2 个答案:

答案 0 :(得分: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列运行,您可以沿着最简单的路线前进,并通过将排序设置为降序来设置选中的列以显示在顶部。 (True = 1,False = 0)

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

以下资源可能有用。

请查看Row Selection

请查看Sorting

答案 1 :(得分:1)

我把这个问题提交给DevExpress的支持团队。他们的反馈是,在我的情况下,我使用数据库服务器模式的地方不支持自定义排序。所以,我的代码是正确的,因为如果没有使用服务器模式,人们将如何实现自定义排序。

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