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ことです:

「少なくとも 1 つのオブジェクトが ICompare を実装する必要があります」

不足しているものを誰か助けることができますか?

4

2 に答える 2

0

必要な並べ替えを実装するには、データ ソースにIXtraSortableインターフェイスを実装する必要があります。

Devex サポートの質問を確認する

于 2013-01-21T10:24:37.313 に答える
-1

ColumnView.CustomColumnSort イベントのドキュメントに目を通して、次の行を確認することをお勧めします。

以下に示すように、カスタム比較の結果を CustomColumnSortEventArgs.Result パラメータに設定する必要があります。

  • データが昇順でソートされているときに、最初の行を 2 番目の行の上に配置する必要がある場合は、Result を -1 に設定します。データを降順に並べ替えると、1 行目は 2 行目の下に配置されます。
  • データが昇順でソートされているときに、最初の行を 2 番目の行の下に配置する必要がある場合は、Result を 1 に設定します。データを降順に並べ替えると、1 行目が 2 行目より上に配置されます。
  • 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 が機能しない

カスタム ソート イベントを発生させるコード スニペットを確認するには、このナレッジベース記事「カスタム ソートの実装方法」に従ってください。この助けを願っています:

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 に答える