• Использование DataPoint или Series компонента Chartдля визуализации графиков [C#]?

    @skosterin88
    Какой тип графика? Просто линия с точками? Если да, то я бы делал один ряд данных с требуемым количеством точек.
    Ответ написан
    Комментировать
  • C#: почему IsBackground не работает?

    @skosterin88
    Здесь нужно смотреть в сторону Task Parallel Library + использования конструкции async-await. Я сделал асинхронной саму процедуру car_1_race и вместо объекта Thread использовал объект Task. Программа, сразу скажу, будет подтормаживать, но форма на запросы реагировать будет.
    Вот моя реализация:
    public delegate void HelperToColl();
        public partial class Form1 : Form
        {
            HelperToColl HTC;
    
            Random rnd = new Random();
            public Form1()
            {
                InitializeComponent();
                HTC = new HelperToColl(car_1_race);
            }
    
            
            private void Start_btn_Click(object sender, EventArgs e)
            {
                //Избавляемся от объекта Thread, он нам здесь не нужен. 
                //Всю асинхронность прячем внутрь вызываемой процедуры.
                //Здесь только обращение к процедуре.
                Invoke(HTC);
            }
    
            //Здесь надо обратить внимание на слово async. 
            //Тем самым мы объявляем процедуру асинхронной.
            public async void car_1_race()
            {
                while (true)
                {
                    //Task.Delay(N).Wait() - если я правильно понимаю, это аналог Thread.Sleep(N)
                    //Я уменьшил со 100 до 50, чтобы не так тормозило.
                    Task.Delay(50).Wait();
                    //Получаем значение смещения как результат асинхронного выполнения процедуры, 
                    //возвращающей случайное число; () => {...} - это и есть та самая процедура.
                    int left = await Task.Factory.StartNew<int>(() => {return rnd.Next(1, 3);});
                    //Смещаем нашу кнопку
                    Car_1_btn.Left += left;
                }
            }
                   
    
        }

    P.S. И да, все же не Coll, а Call.
    Ответ написан
  • Как запускать сайт на ASP .NET MVC из определенной области (area)?

    @skosterin88 Автор вопроса
    Я решил вопрос.
    Для тех, кому актуально - делается это так.

    1) В файле RouteConfig.cs убираем все регистрации маршрутов.
    2) В файле DefaultAreaRegistration.cs в области Default убираем слово "Default" из шаблонов URL при регистрации маршрутов. Должно получиться так:
    public override void RegisterArea(AreaRegistrationContext context) 
            {
                context.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "InstrumentsStore.Areas.Default.Controllers" }
                );
                
                context.MapRoute(
                    "Catalog",
                    "{controller}/{action}/{id}",
                    new { controller = "Catalog", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "InstrumentsStore.Areas.Default.Controllers" }
                );
    
                
            }


    После этих изменений у меня все сработало так, как и было задумано.
    Ответ написан
    Комментировать
  • Как сверстать такой элемент?

    @skosterin88
    Делал нечто похожее раньше.
    Пример того, как это делается: codepen.io/skosterin88/pen/oYmPbW
    Я делал это для другого проекта, соответственно, названия стилей сохранились оттуда.
    nav-ul-li - меню, div с классом services-data - обертка для содержимого таба. Выделенному по умолчанию элементу меню задаем класс service-menu-item-active.
    services-info - это описание отдельного элемента. Для элементов данного класса по умолчанию задаем свойство display:none. Тому, что отображается по умолчанию, задаем отдельный класс service-info-visible.
    Отображение разных табов при нажатии разных кнопок задается уже через JavaScript.
    Ответ написан
    1 комментарий
  • Как добавлять изображения на codepen io?

    @skosterin88
    Я помню, в паре своих проектов на codepen заливал изображения на fastpic, а потом соответствующую ссылку указывал в url в нужном месте. Как-то особых проблем у меня с этим не было.
    Ответ написан
    Комментировать
  • Как привязать ProgressBar в C# (Windows Forms) к определенному методу?

    @skosterin88 Автор вопроса
    aush, спасибо! Заработало.
    Для тех, кому актуально - привожу код:

    DLL-ка с долгоиграющим процессом (LongRunningTask):

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading;//чисто для задержки потоков, т.е. для симуляции долгоиграющего процесса
    
    namespace LongRunningTask
    {
        public class LongRunningTaskPerformer
        {
            //Интерфейс оповещения, реализуемый клиентом, которому интересно состояние долгоиграющего процесса.
            //В нашем случае это форма запуска.
            private readonly INotifyProgress _notifier;
    
            public LongRunningTaskPerformer(INotifyProgress notifier)
            {
                if (notifier != null)
                {
                    _notifier = notifier;
                }
            }
    
            public void Run()
            {
                //После каждого шага вызываем метод-оповещатель Notify. В случае с формой в реализации этого метода будет обновление прогресс-бара.
                DoStep1();
                _notifier.Notify(33);
                DoStep2();
                _notifier.Notify(66);
                DoStep3();
                _notifier.Notify(100);
            }
    
            private void DoStep1()
            {
                Debug.WriteLine("Step 1");
                Thread.Sleep(12000);
                Debug.WriteLine("Step 1 completed!");
            }
    
            private void DoStep2()
            {
                Debug.WriteLine("Step 2");
                Thread.Sleep(12000);
                Debug.WriteLine("Step 2 completed!");
            }
    
            private void DoStep3()
            {
                Debug.WriteLine("Step 3");
                Thread.Sleep(12000);
                Debug.WriteLine("Step 3 completed! Work done.");
            }
        }
    }


    В рамках этой DLL-ки - интерфейс-оповещатель INotifyProgress:

    namespace LongRunningTask
    {
        public interface INotifyProgress
        {
            void Notify(int percent);
        }
    }


    А вот основной проект, в котором содержится форма запуска, использующая BackgroundWorker при обновлении прогресс-бара (MyProgressBar):

    namespace MyProgressBar
    {
        //Наша форма запуска реализует интерфейс оповещения INotifyProgress. Это надо, чтобы форма смогла получать данные о состоянии долгоиграющего процесса
        //ПО МЕРЕ его выполнения. Без реализации интерфейса ничего работать не будет!
        public partial class frmProgressBar : Form, INotifyProgress
        {
            //Класс, выполняющий наш долгоиграющий процесс
            LongRunningTaskPerformer _ltp;
            //Делегат, воспроизводящий внешний вид метода-оповещателя из интерфейса INotifyProgress.
            //Он нужен для обеспечения потокобезопасной передачи данных в форму. Если его не будет, программа вылетит
            //с исключением типа "обращение к progressBar не из его потока" (или что-то подобное).
            delegate void NotifyCallback(int value);
    
            public frmProgressBar()
            {
                InitializeComponent();
            }
    
            //Сам процесс запускается с помощью backgroundWorker-а. Кнопка Run только запускает этот backgroundWorker.
            private void btnRun_Click(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
            }
    
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                //Выполнение долгоиграющего процесса. 
                _ltp = new LongRunningTaskPerformer(this);
                _ltp.Run();
            }
    
            private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                progressBar1.Value = e.ProgressPercentage;
            }
    
            private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //Как-то показываем, что у нас завершился наш долгоиграющий процесс и возвращаем прогресс-бар в исходное состояние.
                MessageBox.Show("Process completed!");
                progressBar1.Value = 0;
            }
    
            //Реализация процедуры оповещения о состоянии долгоиграющего процесса.
            public void Notify(int percent)
            {
                //Чтобы передача состояния процесса сработала корректно и программа не вылетела, 
                //надо делать в точности как здесь (за подробностями - MSDN: 
                //http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28EHInvalidOperation.WinForms.IllegalCrossThreadCall%29;k%28TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5%29;k%28DevLang-csharp%29&rd=true)
    
                if (progressBar1.InvokeRequired)
                {
                    NotifyCallback d = new NotifyCallback(Notify);
                    this.Invoke(d, new object[] { percent });
                }
                else
                {
                    progressBar1.Value = percent;
                }
            }
        }
    }
    Ответ написан
    Комментировать