• Как лучше сделать пагинацию?

    deepblack
    @deepblack
    Очень долго грузится страница, а когда, через ForeginKey выбираю из этого списка записи в select box'е, то страница вообще зависает.

    Но даже правильный выбор варианта пагинации не решит всю проблему. Есть select box (html тег) в котором находится ~20k записей, и именно при работе с ним страница перестает отвечать. Это можно как-то оптимизировать?

    raw_id_fields + list_per_page
    Ответ написан
    4 комментария
  • Как конвертировать JSON массив в JavaScript массив?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const newData = JSON.parse(data).map(Object.values);
    Ответ написан
    Комментировать
  • Как сделать, чтобы ProgressBar работал во время нагрузки на приложение?

    Casper-SC
    @Casper-SC
    Программист (.NET)
    Сделал на основе вашего кода. Вообще нужно это всё писать немного иначе. Передавать ссылку в классы с алгоритмами на контролы - это очень плохая идея и сразу забудьте про такой подход.

    В этом примере если два раза нажать на пункт меню, то запустится два цикла в поток(е/ах) из пула потоков. Это уже сами обработаете.

    В данном примере Analyzer - это отдельная сущность, которая умеет уведомлять о каких-то своих внутренних событиях внешний мир посредством сигналов. Событие и есть тот самый сигнал, а обработать его сможет любое кол-во подписчиков. Событие можно воспринимать, как пины на плате Raspberry Pi, если к нему что-то подсоединить, то можно как-то реагировать на сигнал от пина, тут тоже самое.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ProgressBarExample
    {
        internal class Analyzer
        {
            private readonly SynchronizationContext _synchronizationContext;
    
            public Analyzer()
            {
                // Если экземпляр класса будет создан в UI потоке,
                // то здесь будет контекст синхронизации UI потока, иначе пула потоков
                _synchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
            }
    
            public event EventHandler<AnalyzerEventArgs> ProgressChanged;
    
            public async Task<Data> LoadDataInDB()
            {
                var result = await Task.Run(async () =>
                {
                    for (int i = 0; i < 100; i++)
                    {
                        await Task.Delay(250);
                        OnProgressChanged(new AnalyzerEventArgs("line " + (i + 1), 100));
                    }
                    return new Data() { Text = "Данные " };
                });
                return result;
            }
    
            private void OnProgressChanged(AnalyzerEventArgs args)
            {
                // Перенаправляем выполнение в UI поток не ожидая пока отработает метод обработчик события.
                _synchronizationContext.Post(state =>
                {
                    ProgressChanged?.Invoke(this, (AnalyzerEventArgs)state);
                }, args); // args передаётся в переменную state (грубо говоря)
            }
        }
    }


    namespace ProgressBarExample
    {
        public class AnalyzerEventArgs
        {
            public int MaxLines { get; }
    
            public string CurrentLine { get; }
    
            public AnalyzerEventArgs(string currentLine, int maxLines)
            {
                CurrentLine = currentLine;
                MaxLines = maxLines;
            }
        }
    }


    namespace ProgressBarExample
    {
        public class Data
        {
            public string Text { get; set; }
        }
    }


    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Input;
    
    namespace ProgressBarExample
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            private readonly Analyzer _analyzer;
            private readonly Style _normalBarStyle;
            private readonly Style _loadBarStyle;
            private readonly Style _errorBarStyle;
            private string _maxLines;
            private string _currentLine;
    
            public string MaxLines
            {
                get { return _maxLines; }
                set
                {
                    _maxLines = value;
                    OnPropertyChanged();
                }
            }
    
            public string CurrentLine
            {
                get { return _currentLine; }
                set
                {
                    _currentLine = value;
                    OnPropertyChanged();
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            public MainWindow()
            {
                InitializeComponent();
    
                _normalBarStyle = FindResource("NormalStatusBar") as Style;
                _loadBarStyle = FindResource("LoadDataStatusBar") as Style;
                _errorBarStyle = FindResource("ErrorStatusBar") as Style;
    
                _statusBar.Style = _normalBarStyle;
                
                _analyzer = new Analyzer();
                _analyzer.ProgressChanged += OnAnalyzerProgressChanged;
            }
    
            private void OnAnalyzerProgressChanged(object sender, AnalyzerEventArgs args)
            {
                // Передавать каждый раз одно и тоже бессмысленно, сделаете сами как нужно
                MaxLines = args.MaxLines.ToString();
                CurrentLine = args.CurrentLine;
            }
    
            private async void LoadDataToDB_Click(object sender, RoutedEventArgs e)
            {
                _statusBar.Style = _loadBarStyle;
                Mouse.OverrideCursor = Cursors.Wait;
    
                try
                {
                    var data = await _analyzer.LoadDataInDB(); 
                    MessageBox.Show(data.Text);
                }
                finally
                {
                    Mouse.OverrideCursor = Cursors.Arrow;
                    _statusBar.Style = _normalBarStyle;
                }
            }
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


    <Window
        x:Class="ProgressBarExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:ProgressBarExample"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="800"
        Height="450"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        mc:Ignorable="d">
        <Window.Resources>
            <Style x:Key="NormalStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#FF007ACC" />
            </Style>
            <Style x:Key="LoadDataStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#9333FF" />
            </Style>
            <Style x:Key="ErrorStatusBar" TargetType="DockPanel">
                <Setter Property="Background" Value="#eb4034" />
            </Style>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="20" />
            </Grid.RowDefinitions>
            <Menu VerticalAlignment="Top">
                <MenuItem Header="File">
                    <MenuItem
                        x:Name="LoadDataToDB"
                        Click="LoadDataToDB_Click"
                        Header="LoadDataToDB" />
                </MenuItem>
            </Menu>
            <DockPanel
                x:Name="_statusBar"
                Grid.Row="1"
                Style="{StaticResource LoadDataStatusBar}">
                <!--  Style меняться во время выполнения LoadDataInDB()  -->
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock
                        Grid.Column="0"
                        Margin="10,0,0,0"
                        Foreground="White"
                        Text="Статус данных" />
                    <DockPanel Grid.Column="1" HorizontalAlignment="Right">
                        <TextBlock
                            Margin="0,0,5,0"
                            Foreground="White"
                            Text="{Binding CurrentLine}" />
                        <!--  должно меняться во время выполнения LoadDataInDB()  -->
                        <TextBlock
                            Margin="0,0,5,0"
                            Foreground="White"
                            Text="/" />
                        <TextBlock
                            Margin="0,0,10,0"
                            Foreground="White"
                            Text="{Binding MaxLines}" />
                    </DockPanel>
    
                </Grid>
            </DockPanel>
        </Grid>
    </Window>
    Ответ написан
    Комментировать
  • Как сделать, чтобы ProgressBar работал во время нагрузки на приложение?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    можно. только надо вынести обработку данный в отдельный от UI поток, а то блокировка получается

    гуглите и обрящете прогресбар wpf
    Ответ написан
    7 комментариев