2012-04-23 12 views
3

グリッドが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

私はあなたのためのソリューションを持っていないが、両方の項目が同じクラスであるため、あなただけの1つのPropertyInfoオブジェクトを宣言する必要があります。その1つのPropertyInfoオブジェクトを使用して、両方の項目の.GetValueを呼び出すことができます。反射はプロセッサにとってもう少し「高価」なので、これはマイナーな性能向上になります。 – MCattle

答えて

0

あなたがnullチェックを行う前に、変数のGetTypeを呼んでいます。

すべてを処理する必要があるものの前にヌルチェックを行う場合。

+0

それはnullを扱うことができない理由ですが、OPはソート時に処理方法も尋ねています。あなたが何かを返さなければ、あなたの "ソートされたリスト"は無作為にヌル値で散在します。 –

+0

私は、「最初に行かなければならない」よりも、「どうやってクラッシュさせないのか」と考えています。いずれにせよ、あなたはすでにそれをカバーしています。だから、なぜ同じ情報を重複して提供するのですか? – Servy

+0

私はOPの方がオブジェクト内のフィールドがnullであることをより心配していたと考えていますが、オブジェクト自体もnullをチェックする必要があります。 – MCattle

関連する問題