0

这项任务似乎很容易。

我想允许 XtraGrid 按图像列排序(图像表示状态)

根据手册,您只需将列排序模式设置为自定义并在 CustomColumnSort Eventhandler 中放置一些代码。

在这里它不起作用,事件处理程序从未被调用。

我明确地尝试了以下内容:

gridViewLeftGrid.Columns["ImageColumnName"].OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.True;
gridView.Columns["ImageColumnName"].SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
gridView.CustomColumnSort += gridView_CustomColumnSort;
gridView.CustomColumnGroup += grid_CustomColumnGroup; 

void gridView_CustomColumnSort(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnSortEventArgs e)
{
    throw new NotImplementedException();
}

但仍然 - 从未达到 gridView_CustomColumnSort 中的断点。

我看到的唯一影响是,现在每次加载或更新网格时都会引发错误DevExpress.Data.Storage.DataStorageObjectComparer.CompareRecordsCode

“至少一个对象应该实现 ICompare”

任何人都可以帮助缺少什么吗?

4

2 回答 2

0

Your data source should implement the IXtraSortable interface in order to implement the desired sorting

Check Devex Support Question

于 2013-01-21T10:24:37.313 回答
-1

我建议您仔细阅读 ColumnView.CustomColumnSort 事件文档并查看以下几行:

自定义比较的结果应设置为 CustomColumnSortEventArgs.Result 参数,如下所示:

  • 如果数据按升序排序时第一行应位于第二行上方,则将 Result 设置为 -1。当数据按降序排序时,第一行将位于第二行之下。
  • 如果数据按升序排序时第一行应位于第二行下方,请将 Result 设置为 1。当数据按降序排序时,第一行将位于第二行之上。
  • 将 Result 设置为 0 以指示行相等。在这种情况下,行将根据它们在数据源中的索引在网格内排列。

注意:如果当前比较操作是 ,则应
CustomColumnSortEventArgs.Handled参数设置为。您可以将此参数设置为 false 以在事件处理程序完成后调用默认比较机制。在这种情况下,自定义比较操作的结果将被忽略。truehandled

检查示例:

protected void grid_CustomColumnSort
(object sender, DevExpress.Web.ASPxGridView.CustomColumnSortEventArgs e) {
    if (e.Column.FieldName == "Country") {
        e.Handled = true;
        string s1 = e.Value1.ToString(), s2 = e.Value2.ToString();
        if (s1.Length > s2.Length)
            e.Result = 1;
        else
            if (s1.Length == s2.Length)
                e.Result = Comparer.Default.Compare(s1, s2);
            else
                e.Result = -1;
    }
}

您也可以在这样的事件上实现比较代码:

if (e.Column.FieldName == "Importance")
{
     int n1 = (int)gridControl1.GetCellValue(e.ListSourceRowIndex1, "Rank");
     int n2 = (int)gridControl1.GetCellValue(e.ListSourceRowIndex2, "Rank");

     e.Result = Comparer<int>.Default.Compare(n1, n2); /// comparator here, that set the e.result

     e.Handled = true;
}

参考:
如何:实现自定义排序
DXGrid CustomColumnSort 无法正确排序
CustomColumnSort 无法正常工作
ASPxGridView - 如何对组进行排序- 它与 asp.net 网格有关,但可能会有所帮助

按照这篇知识库文章 -如何实现自定义排序,检查引发自定义排序事件的代码片段。希望这有帮助:

public partial class GridCustomSortTest : Form
{
    public GridCustomSortTest()
    {
        InitializeComponent();
    }

    private void GridCustomSortTest_Load(object sender, EventArgs e)
    {
        string[] months = new string[] { "January", "February", "March", 
            "April", "May", "June", "July", "August", "September", 
            "October", "November", "December" };

        grid.DataSource = months;
        grid.RefreshDataSource();
        gridView1.Columns[0].SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
        gridView1.CustomColumnSort += new DevExpress.XtraGrid.Views.Base.CustomColumnSortEventHandler(gridView1_CustomColumnSort);


    }

    void gridView1_CustomColumnSort(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnSortEventArgs e)
    {
        e.Result = Comparer<int>.Default.Compare(e.ListSourceRowIndex1,
           e.ListSourceRowIndex2);

        e.Handled = true;
    }
}
于 2013-01-21T10:51:35.137 回答