1

最初:私たちは使用しますinfragistics xamdatagrid 11.1.20111.2053

私たちの問題:

一般的なリストでグリッドを使用します。そのため、非常に動的であり、あらゆる状況に備える必要があります。各フィールド タイプに対して、SortComparer、FilterComparer、エディター タイプ、Edita タイプ、およびスタイル エディターを設定します。モデルの一部のプロパティには、特別な TypeConverter を使用します。たとえば、セルでは、一部の値が表示できません。

0 = string.Empty
1 = 1
2 = 2

最初の解決策として、型コンバーターと特別なソート比較子のみを使用します。

public class HideZeroIntEntryConverter : Int32Converter
{
  public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
    if (value is int) {
      if (destinationType == typeof(string)) {
        return ((int)value != 0) ? value.ToString() : string.Empty;
      }
      return ((int)value != 0) ? value : Binding.DoNothing; // this is the best solution to tell the grid the cell is empty
    }
    return base.ConvertTo(context, culture, value, destinationType);
  }
}

これは、フィルタリングしない場合は完璧に機能しますが、値をフィルタリングしたい場合は、フィルター ドロップダウン項目に醜い「Binding.DoNothing」が表示されます (並べ替えとフィルタリングも間違っています)。また、コンバーターがstring.emptyと言うため、「0」をフィルタリングすることはできません...

2 番目のソリューションでは、特別な XamTextEditor を使用します。

public class HideZeroIntEntryTextEditor : XamTextEditor
{
  public HideZeroIntEntryTextEditor() {
    this.ValueToDisplayTextConverter = new HideZeroIntEntryValueConverter();
  }
}

public class HideZeroIntEntryValueConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
    if (value is int) {
      if (targetType == typeof(string)) {
        return ((int)value != 0) ? value.ToString() : string.Empty;
      }
      // this never happens
      return ((int)value != 0) ? value : Binding.DoNothing;
    }
    // this never happens
    return targetType == typeof(string) && value != null ? value.ToString() : value;
  }
}

およびフィールド設定用

  field.Settings.EditAsType = typeof(int);

  field.Converter = null;
  field.Settings.EditorType = typeof(HideZeroIntEntryTextEditor);
  field.Settings.SortComparer = GenericComparer<int>.Instance;
  field.Settings.FilterComparer = GenericComparer<int>.Instance;
  field.Settings.GroupByComparer = GroupByRecordComparer<int>.Instance;

これで、リストに表示されない場合でも、「0」にフィルターできます。

ただし、どちらの場合も、実際には存在しないため、空のエントリでフィルタリングすることはできません! でもしたい!私たちの意見では、これは、独自の特別なフィルターを作成できれば可能性があります. しかし、残念ながらこれはそれほど簡単ではありません。はい、特別なフィルター ブランクと NonBlanks を削除できますが、これはすべてのグリッドに適用されます。オーバーライドする特別なフィルターは非常に複雑で、修正することさえできません。

OK、空のセルを表示して、このセルをフィルター処理したいのですが、特別なフィルターが正しく機能しません!

何ができるか、何かアイデアはありますか?

これがインフラジスティックスの質問です

4

1 に答える 1

3

ここのインフラジスティックス フォーラムでサンプルを使用してこれに回答しました。

フィールドのエディターが HideZeroIntEntryTextEditor の場合、RecordFilterDropDownPopulating イベントを使用して、"(Blanks)" の既存の FilterDropDownItem を削除し、値 0 のカスタム アイテムに置き換えることができます。次のコードはこれを実現します。

void XamDataGrid1_RecordFilterDropDownPopulating(
  object sender, 
  //Infragistics.Windows.DataPresenter.Events.
  RecordFilterDropDownPopulatingEventArgs e) 
{
  if (e.Field.EditorTypeResolved == typeof(HideZeroIntEntryTextEditor)) {
    bool found = false;
    int index = 0;
    while (index < e.DropDownItems.Count && !found) {
      FilterDropDownItem item = e.DropDownItems[index];
      if (item.DisplayText == "(Blanks)") {
        e.DropDownItems.Remove(item);
        e.DropDownItems.Insert(index, new FilterDropDownItem(
          new ComparisonCondition(ComparisonOperator.Equals, 0), "(Blanks)"));
        found = true;
      }
      index++;
    }
  }
}
于 2012-02-10T19:40:37.507 に答える