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

Posted

技术标签:

【中文标题】基于所选行的 Devexpress MVC Gridview 自定义排序【英文标题】:Devexpress MVC Gridview custom sort based on selected rows 【发布时间】:2016-08-31 04:19:19 【问题描述】:

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

我有以下内容,这是我将几十个非解决方案混合在一起的最佳尝试。请注意 cmets:

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

如果我单击“customsort”列,它会执行回发,但排序顺序不会改变。所以至少我已经到达了某个地方,但我还没有到达那里。

【问题讨论】:

【参考方案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;

以下资源可能很有用。

看看这个Row Selection

看看这个Sorting

【讨论】:

好吧,我可以让我的自定义排序列真正变得任何东西。它刚刚被放入,所以我可以手动调用一个 Customrow.Sort() 方法,该方法将按选择进行排序。谢谢你。为您提供 200 个互联网。 更新:虽然您的代码编译得很好。网格视图实际上并未在此列上排序。 用您尝试过的内容更新帖子,等我回来再看看。你有没有看链接。马上阿夫克 谢谢。是的,我做到了。我在这些页面上使用了指南。 @JuannStrauss,在CustomColumnSort 中放置一个断点并逐步执行。检查它是否正在处理排序。您是否尝试过第二个建议。【参考方案2】:

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

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

【讨论】:

以上是关于基于所选行的 Devexpress MVC Gridview 自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 UIPickerView 所选行的颜色

如何读取表格视图中所选行的背景颜色?

所选行的 WPF DataGrid RowStyle 不改变背景和前景色

Angular Kendo Grid:所选行的背景颜色

如何在radgrid中查找所选行的列值

DataTables/TableTools - 单击一行时是不是可以获得所选行的准确列表?