3

グリッドが ObjectDataSource を使用してデータを取得するユーザー コントロールがあります。グリッド内のすべての列は並べ替え可能です。ユーザーが特定の列名をクリックすると、その列に基づいてリストがソートされます (List.Sort(sortColumn))。

列の 1 つのフィールドに空白/null 値がある場合、問題に直面しています。strA/strB が null または両方が null の場合、比較行 strA.CompareTo(strB) は「オブジェクト参照がオブジェクトのインスタンスに設定されていません」で失敗します。

ただし、null 参照例外を回避するために、strA と strB に !string.IsNullOrEmpty() を含めました。それでも、グリッドはソートされません。

コード スニペットを以下に示します。

int IComparer<MyWorklistItem>.Compare(MyWorkItem x, MyWorkItem y)
{
        int sortValue = 1;
        if (this.strSortField.Length == 0)
        {
            return 0;
        }
        MyWorkItem item1 = this.blnSortDesc ? y : x;
        MyWorkItem item2 = this.blnSortDesc ? x : y;

        PropertyInfo property1 = item1.GetType().GetProperty(this.strSortField);
        PropertyInfo property2 = item2.GetType().GetProperty(this.strSortField);

        string strA = (string)property1.GetValue(item1, null);
        string strB = (string)property2.GetValue(item2, null);

        if (!string.IsNullOrEmpty(strA) && !string.IsNullOrEmpty(strB))
        {               
            sortValue = strA.CompareTo(strB);
        }           
        return sortValue;
    }

値の 1 つまたは両方が null の場合、どのように並べ替えますか。

注: 私は VS 2005 を使用しているため、LINQ の可能性はありません。

提案してください。

ありがとう、スリラム

4

2 に答える 2

3

string.Compare常に文字列プロパティを比較している場合は、インスタンス メソッドではなく静的メソッドを使用して null の問題を回避できます。

http://msdn.microsoft.com/en-us/library/system.string.compare.aspx

于 2012-04-23T14:40:24.913 に答える
0

GetTypenull チェックを行う前に、変数を呼び出しています。

すべてを処理する必要がある他の何よりも前にnullチェックを行う場合。

于 2012-04-23T14:38:56.473 に答える