Как я могу переопределить специальные операнды фильтра "Пробелы" и "NonBlanks" для XamDataGrid? - PullRequest
1 голос
/ 10 февраля 2012

сначала: мы используем infragistics xamdatagrid 11.1.20111.2053

наша проблема:

Мы используем сетку с общими списками. Так что это очень динамично и должно быть готово к любой ситуации. Мы устанавливаем для каждого типа поля theSortComparer, 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» в выпадающих элементах фильтра (сортировка и фильтрация также неправильны) Кроме того, мы не можем фильтровать для «0», потому что мы конвертер говорит string.empty ...

Второе решение, мы используем специальный 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, НО, которые применяются ко всем сеткам. Специальный фильтр для переопределения очень сложен и даже не корректен.

Хорошо, мы хотим видеть пустую ячейку и хотим отфильтровать эти ячейки, но специальный фильтр не работает правильно!

Что мы можем сделать, любые идеи?

вот вопрос по инфрагистика

1 Ответ

3 голосов
/ 10 февраля 2012

Я ответил на это на форумах по инфраструктуре прямо здесь с примером.

Вы можете использовать событие RecordFilterDropDownPopulation, чтобы удалить существующий FilterDropDownItem для «(Пробелы)» и заменить его на пользовательский для значения 0, если редактором для этого поля является HideZeroIntEntryTextEditor. Следующий код выполняет это:

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++;
    }
  }
}
...