Фильтрация базы данных SQLite с помощью SearchBar - PullRequest
0 голосов
/ 28 мая 2020

Мне удалось сгенерировать и показать базу данных SQList, и теперь я хочу отфильтровать ее с помощью панели поиска, я читал много руководств, но не могу заставить их работать ...

У меня есть модель SQLite с этим кодом:

using SQLite;
namespace AppListo
{
public class Employee
  {
    [PrimaryKey, AutoIncrement]
    public long EmpId
    { get; set; }
    [NotNull]
    public string EmpName
    { get; set; }

  }
}

... и я извлекаю список данных из базы данных с помощью:

public List<Employee> GetAllEmployees()
    {
        return dbConn.Query<Employee>("Select * From [Employee]");
    }

... и я показываю list на ContentPage с этим кодом xaml:

<ListView x:Name="lstData" HasUnevenRows="false" Header="Header Value" Footer="Footer" ItemSelected="OnSelection" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" Padding="5,5,5,5">
                            <Label Text="{Binding EmpName}" FontSize="Medium" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
</ListView>

... и этим кодом позади:

var vList = App.DAUtil.GetAllEmployees();
lstData.ItemsSource = vList;

... но я не знаю, как отфильтровать этот список с помощью панель поиска. Не могли бы вы помочь мне в этом?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

использовать LINQ

var vList = App.DAUtil.GetAllEmployees();
lstData.ItemsSource = vList.Where(e => e.Name.Contains(mySearchString));
0 голосов
/ 28 мая 2020

Создайте свойство на вашем View Model, например

public ObservableCollection<Employee> Employees { get; set; }

<ListView x:Name="lstData" HasUnevenRows="false" ItemsSource="{Binding Employees}" Header="Header Value" Footer="Footer" ItemSelected="OnSelection" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" Padding="5,5,5,5">
                            <Label Text="{Binding EmpName}" FontSize="Medium" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
</ListView>

Затем создайте метод для привязки значений dataset к вашему списковому представлению

        private async Task BindEmployees()
        {


            List<Employee> employees = await GetAllEmployees();

            Employees = new ObservableCollection<Employee>(

                            vList.Where(e => e.Name.Contains(mySearchString)).
                            OrderBy(x => x.EmpName).ToList());

            await RaisePropertyChanged("Employees");


        }

Вызов этого метода при загрузке страницы или внутри вашего View Model's конструктора

            Task.Run(async() => {
                await BindEmployees();
            });

Также создайте метод Handler, который будет вызываться каждый раз, когда вы вводите что-либо в search bar

и снова вызовите BindEmployees метод внутри этой функции-обработчика


 FilterEmployee_Handler(TextChangedEventArgs args) {
await BindEmployees(),

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...