グリッドがObjectDataSourceを使用してデータを取得するというユーザーコントロールがあります。グリッド内のすべての列はソート可能です。ユーザーが特定の列名をクリックすると、その列に基づいてリストがソートされます(List.Sort(sortColumn))。リストにnull値があるとList.Sort()が失敗する
フィールドに空白/ヌル値が設定されている問題が発生しました。 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;
}
いずれかの値または両方がnullの場合、どのようにソートするのですか。
注:私はVS 2005を使用しているので、LINQの可能性はありません。
お勧めします。
おかげで、 スリラム
私はあなたのためのソリューションを持っていないが、両方の項目が同じクラスであるため、あなただけの1つのPropertyInfoオブジェクトを宣言する必要があります。その1つのPropertyInfoオブジェクトを使用して、両方の項目の.GetValueを呼び出すことができます。反射はプロセッサにとってもう少し「高価」なので、これはマイナーな性能向上になります。 – MCattle