Фильтровать DataGrid в текстовом поле

Как сказал Грег Хьюгилл, typedef означает, что вам больше не нужно писать struct повсюду. Это не только экономит нажатия клавиш, но и может сделать код чище, так как он обеспечивает smidgen больше абстракции.

Такие вещи, как

typedef struct {
  int x, y;
} Point;

Point point_new(int x, int y)
{
  Point a;
  a.x = x;
  a.y = y;
  return a;
}

становятся чище, когда вам не нужно видеть ключевое слово «struct» повсюду, это выглядит так, как будто на самом деле есть тип с именем «Point» в вашем язык. Который, после typedef, случай, я думаю.

Также обратите внимание, что, хотя ваш пример (и мой) опускает наименование самого struct, собственно именование также полезно, когда вы хотите предоставить непрозрачный тип. Тогда у вас будет такой код в заголовке, например:

typedef struct Point Point;

Point * point_new(int x, int y);

, а затем укажите определение struct в файле реализации:

struct Point
{
  int x, y;
};

Point * point_new(int x, int y)
{
  Point *p;
  if((p = malloc(sizeof *p)) != NULL)
  {
    p->x = x;
    p->y = y;
  }
  return p;
}

В этом последнем случае Вы не можете вернуть Point по значению, так как его определение скрыто от пользователей заголовочного файла. Этот метод широко используется, например, в GTK + .

ОБНОВЛЕНИЕ Обратите внимание, что существуют также высоко ценимые C-проекты, где использование typedef для сокрытия struct считается плохой идеей, ядро ​​Linux, вероятно, является наиболее известным таким проектом , См. Главу 5 из документа Linux Kernel CodingStyle для гневных слов Линуса. :) Моя точка зрения заключается в том, что слово «должен» в этом вопросе, возможно, не заложено в камень.

25
задан Robert Harvey 15 November 2018 в 23:15
поделиться

2 ответа

Я видел на разных сайтах много шума по этому поводу ...

Чтобы отфильтровать последний, являющийся сеткой данных, используя источник данных в качестве источника, что довольно часто делается для кода ниже:

DataTable dt = new DataTable("Table1");

//fill your datatable...

//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";
6
ответ дан 28 November 2019 в 21:32
поделиться

Я написал свой собственный элемент управления FilterDataGrid, он гораздо более гибкий, чем те, что представлены в CodeProject или где-либо еще. Я не могу ни опубликовать здесь полный код, ни опубликовать его.

Но: поскольку ваш источник данных, скорее всего, заключен в ICollectionView, вы можете сделать что-то вроде этого:

    public void ApplyFilters()
    {
        ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
        if (view != null)
        {
            view.Filter = FilterPredicate; 
        }
    }

    private bool FilterPredicate(object item)
    {
        var yourBoundItemOrRow = item as BoundItemType;

        return aFilterObject.Matches(yourBoundItemOrRow);
    }

Вы можете легко реализовать любую логику фильтра на основе этой концепции. Даже очень, очень мощные фильтры. Примечание: у меня есть эти методы в моем собственном классе, полученные из сетки данных. Они также могут быть адаптированы для работы вне сетки, например, в UserControl

0
ответ дан 28 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: