Ответы пользователя по тегу C#
  • ComboBoxMenu_SelectionChanged - стандартная реализация?

    @Sumor
    Вы определитесь у вас ListBox или ComboBox.
    В заголовке ComboBox, поэтому когда вызывается событие, у вас sender типа ComboBox, а не ListBox к которому вы приводите.
    Ответ написан
    Комментировать
  • Как группу CheckBox прибиндить к одному свойcту во ViewModel?

    @Sumor
    Во ViewModel свойство "дни недели" и ссылки для каждого дня недели для добавления и удаления в список:
    private List<System.DayOfWeek> _dayWeeks = new List<System.DayOfWeek>();
    public List<System.DayOfWeek> DayWeeks
    {
      get{return _dayWeeks;}
    }
    
    public bool HasMonday
    {
      get{ return _dayWeeks.Any(d => d  == DayOfWeek.Monday);}
      set
      {
        if(value && !HasMonday)
        {
          _dayWeeks.Add(DayOfWeek.Monday);
          OnPropertyChanged("DayWeeks");
          OnPropertyChanged("HasMonday");     
        }
        if(!value && HasMonday)
        {
          _dayWeeks.Remove(DayOfWeek.Monday);
          OnPropertyChanged("DayWeeks");
          OnPropertyChanged("HasMonday");     
        }
      }
    }
    // Дальше аналогично для других дней недели

    Могут быть нюансы с добавлением/удалением из списка от того, что DayOfWeek это enum. Нет возможности сейчас проверить.

    Есть другой вариант. Создать своё представление дней недели по битам байта: Понедельник - 1, Вторник - 2, Среда - 4, Четверг - 8, Пятница - 16, Суббота - 32, Воскресенье - 64
    Тогда свойство DayWeeks должно по get генерить List на основе битов. А свойства HasMonday и т.п. будут взводить/сбрасывать соответствующий бит.
    Ответ написан
  • Как правильно дополнить команду Application.Delete, сохранив её базовое выполнение?

    @Sumor
    Для назначения обработчиков команде нужно указать в разделе CommangBindings контрола, в котором будет вызываться эта команда или в любом из его логических предков, обработчик событий Execute и/или обработчик CanExecute.
    После этого вы привязываете команду к пункту меню, кнопке, через соответствующее свойство Command, либо указываете горячую клавишу или жест мыши через InputBindings.
    Ответ написан
  • Как получать данные из БД каждые 10 секунд (Entity Framework)?

    @Sumor
    Строчка usersGrid.ItemsSource = db.USER.Local.ToBindingList(); говорит о том, что конкретно этот текущий список записей из таблицы опубликовать в DataGrid. При повторном выполнении Load() у вас создаются новые списки, никак не связанные с тем, что находится сейчас в DataGrid. Поэтому обновления не происходит.
    Чтобы понять что изменилось в БД с момента прошлого считывания можно использовать, например, время изменения записи. И каждые 10 (или сколько вы захотите) секунд считывать только изменённые записи.
    Просто так изменённые записи в уже считанный и добавленный в грид список не обновить. Нужно найти среди существующих строчек те, что обновились в соответствии с запросом и изменить их реквизиты. Так как вы используете BindingList, то по идее после изменения записи в списке DataGrid должен обновить запись на экране.
    Схема может быть примерно такая:
    DataGrid на форме привязан (Binding) к один раз созданному списку сообщений типа BindingList<> или ObservableCollection<>. Сообщения, которые хранятся в этом списке должны реализовывать шаблон PropertyChanged. Список первоначально начитывается при старте формы. После создания, заполнения и привязки к DataGrid нельзя удалять/пересоздавать список. Если вам нужно его перечитать целиком - выполняете Clear() и добавляете записи заново. Далее по таймеру считываете изменённые или добавленные записи и пробегаете по вашему списку и их находите и изменяете. Отрабатывает PropertyChanged на сообщениях, отрабатывает изменение списка, отрабатывает обновление DataGrid. Если у вас считывание из базы происходит недолго, то вам достаточно использовать DispatcherTimer. Он выполняется в том же потоке где живёт DataGrid и список сообщений. Если же вас это не устраивает и вы хотите поиграть в потоки, то вам нужно использовать потокобезопасные коллекции и/или устраивать синхронизацию действий. Но это тема другого вопроса.
    Ответ написан
    Комментировать
  • Как оформить запрос в базу данных если нужно базироваться на дате?

    @Sumor
    Число дней в виде строки это конечно прелестно.
    Как минимум нужно знать что за СУБД.
    В SQLServer есть функция DATEADD(datepart , number , date). В MySql - функция DATE_ADD(date,INTERVAL expr type).
    Преобразуете строку с количеством дней в число, затем прибавляете с помощью указанных функций к сегодняшней дате.
    Ответ написан
    Комментировать
  • Как узнать уровень в иерархии выбранного элемента в TreeView?

    @Sumor
    Когда вы программируете на WPF подразумевается, что визуальная часть является отражением вашего представления данных. Поэтому уровень иерархии выбранный элемент должен находить не среди элементов TreeViewItem, а среди родителей выбранного элемента в соответствии с моделью представления данных.
    Пример:
    class A
    {
     public string Name{get;set;}
     public A Parent {get;set;}
     public IEnumerable<A> Children
     {
      get
      {
        return AllItemsOfA.Select(a => a.Parent == this);
      }
     }
     public int Level()
     {
      int level = 0;
      var current = Parent;
      while(current != null)
      {
        current = current.Parent;
        level ++;
      }
      return level;
     }
    }

    Добавив коллекцию таких элементов в TreeView вы у выбранного элемента получите нужный вам уровень иерархии.
    Ответ написан
    Комментировать
  • Почему не работает русский язык в консоли .NET Core?

    @Sumor
    По умолчанию, в консоли Windows кодировка 866.
    Переключите кодировку перед выводом.
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    Либо переключите консоль в режим UTF-8 в батнике:
    chcp 65001
    Ответ написан
    1 комментарий
  • Что не так с наследованием интерфейсов?

    @Sumor
    Вы не указали, что Lol реализует интерфейс IParent
    public class Lol : IChild, IParent
    А также, вероятно, вы хотели в IChild добавить свойство Family

    После обновления кода:
    Вы используете явную реализацию интерфейса, но у IChild нет собственного свойства Family, только наследуемое от IParent. Как раз можно изучить ключевое слово new у свойств.
    Возможно то что вы хотите посмотреть делается так:
    using System;
    
    
    public class Test
    {
    	public static void Main()
    	{
    		Lol l = new Lol();
    		Console.WriteLine(((IParent)l).Family);
    		Console.WriteLine(((IChild)l).Family);
    		Console.WriteLine(l.Name);
    		Console.ReadLine ();
    	}
    }
    
    public class IParent
    {
    	public string Family { get { return "suck"; } }
    }
    
    public class IChild : IParent
    {
    	public string Family { get { return "duck"; } }
    
    }
    
    public class Lol : IChild
    {	
    	public string Name { get { return "ross"; } }
    }
    // Вывод:
    // suck
    // duck
    // ross
    Ответ написан
    Комментировать
  • Работа с *.txt с нескольких приложений одновременно?

    @Sumor
    Для одновременной работы с файлом несколькими приложениями его нужно открывать во всех приложениях со специальным указанием: FileShare.ReadWrite
    FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

    В этом случае все приложения смогут одновременно читать и писать в файл. Это накладывает определённые ограничения на приложения - они должны как-то договариваться и понимать куда они могут писать, а куда - нет.
    Каждая программа должна писать только изменения в файл, а не переписывать его - иначе другие программы отвалятся.
    Это большой геморрой. Так делать не надо.
    Если вы всё-таки решитесь, то нужно файл разбить на блоки. Перед записью в блок программа будет его помечать, что-бы другие программы ждали, пока вы закончите с ним работать, после записи - сбрасывать пометку. Если данные удалились - нужна пометка, что блок удалён, так как нельзя сдвигать файл - его могут читать другие программы. Если данные увеличились в размере - ставить отметку удаления и записывать новые данные в конец. И тд, и тп.
    Большая часть из этого заложено, например, в формат dbf. Но реализовывать всё это придётся руками.
    Кроме того остаётся вопрос с синхронизацией изменений. Если вы в одной программе поменяли список - как об этом узнает программа на другом компьютере. Это может быть слежение за временем изменения файла, или за специальными отметками в файле ... Постоянные проблемы с синхронизацией, постоянное состояние гонки, взаимоблокировки и т.д. В общем, так делать не надо.
    Конечно, если каждой запущенной программе отводится только одна строчка и другие её не трогают, то можно попробовать изменять только её.

    Если у вас, в основном, чтения и иногда "точечные" изменения, то можно предложить следующий вариант:
    при записи: ожидать завершение всех чтений, а затем блокировать файл с FileShare.None, изменить и отпустить.
    при чтении: ожидать завершение записи, если она есть, затем открытие файла с FileShare.Read (это не блокирует другие чтения), быстрое чтение и закрытие файла.
    Под ожиданием я понимаю попытку открытия файла с соответствующими параметрами, и в случае исключения повтор через таймаут.
    Ответ написан
    Комментировать
  • Как выбрать элемент в comboBox по имени?

    @Sumor
    Items используется для "поэлементной" работы, а ItemsSource для подключения коллекций. Нельзя работать с ними одновременно - либо Items, либо ItemsSource.
    Поэтому ваш код должен преобразиться примерно в такой:
    comboBox2.SelectedIndex = (comboBox2.ItemsSource as System.Data.DataView).IndexOf("Вася");

    Но это не будет работать, так как в качестве элементов в ComboBox располагаются элементы из таблицы целиком, а не только имена. Поэтому лучше и удобнее пользоваться свойством SelectedItem, примерно так:
    comboBox2.SelectedItem = (comboBox2.ItemsSource as System.Data.DataView).Find("Вася");

    А ещё лучше через Binding связать свойство comboBox2.SelectedItem с каким-либо свойством вашей модели и использовать её.
    Ответ написан
    Комментировать
  • Как заставить приложение принимать-отправлять данные в com портом в ардуино?

    @Sumor
    Порт закрыт - данных нет. когда порт открыт данные накапливаются в приёмном буфере, пока вы их не прочитаете через Read или ReadLine.
    Жалко нет вариантов вашего чтения, толку было бы больше.
    Ну и самая вероятная причина: вы читаете из Windows методом ReadLine, который ждёт окончание строки в виде 0x0d0a, а пишите arduino, который скорее всего посылает один символ 0x0d.
    Ответ написан
    6 комментариев
  • Как загрузить папку по FTP C#?

    @Sumor
    Ну собственно MSDN объясняет всё в лучшем виде:
    https://msdn.microsoft.com/ru-RU/library/ms229718(...
    Создаёте объект с путём до объекта с которым вы хотите что-то сделать. Т.е. если вы хотите добавить папку в этом пути должно быть имя новой папки; если загрузить файл, то имя нового файла и т.д.
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
    указываете пользователя и пароль в Credentials
    request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");

    указываете что вы хотите сделать через WebRequestMethods.Ftp
    request.Method = WebRequestMethods.Ftp.MakeDirectory;

    Указываете необходимые дополнительные параметры запроса, по необходимости. И делаете запрос
    FtpWebResponse response = (FtpWebResponse) request.GetResponse();

    В зависимости от того, что вы хотели от сервера - разбираете ответ. Подробнее - в справке по каждому методу.
    Ответ написан
  • Как отловить нажатие Alt+Shift вне моего приложения (глобально)?

    @Sumor
    Вне вашего приложения - есть системный индикатор, который можно таскать куда угодно. Хотите сделать такой-же - изучайте хуки.
    В вашем приложении вы можете получать текущую раскладку при получении фокуса на ваши окна и выставлять свой индикатор в нужное положение. Для отлова смены раскладки при вашем активном окне - обрабатывайте получение события WM_INPUTLANGCHANGE.
    Ответ написан
    3 комментария
  • Возможно ли функциональное программирование в C# без LINQ?

    @Sumor
    Хотите функциональное программирование на C# - попробуйте F#.
    Ответ написан
    Комментировать
  • Чтение из StandardOutput запущенного Process, возникает ошибка?

    @Sumor
    RedirectStandardOutput вы переопределили, а RedirectStandardInput нет. поэтому у процесса нет открытого потока для чтения. Укажите RedirectStandardInput = true при создании процесса.
    Ответ написан
    1 комментарий
  • Часто ли .net программисты сталкиваются в работе с с++?

    @Sumor
    При программировании на C# программирование C++ не нужно. Но часть примеров, особенно если сталкиваешься с чистым WinApi, или с COM (DCOM), или работой с необычными устройствами, написана на C++. Поэтому есть необходимость уметь читать и понимать примеры на C++. А иногда на VB или даже на Delphi.
    Ответ написан
    Комментировать
  • Как открыть файл при перетаскивание в окно?

    @Sumor
    Простой способ: Для формы разрешите AllowDrop и ловите событие DragDrop. В её параметрах будет описание того, что на вас кидают.

    Сложный способ: для затравки прочитайте вот это https://habrahabr.ru/post/179131/.
    Там описана реализация на Delphi, но последовательность действий такая же.
    Нужно описать все функции, которые используются через DllImport. Вызвать DragAcceptFiles.
    Переопределить Wndproc для формы protected override void WndProc(ref Message m), и там обрабатывать событие WM_DROPFILES и через DragQueryFile получить переданный список.
    Ответ написан
    Комментировать
  • Где в Windows Forms подключаться к базе данных?

    @Sumor
    Мне кажется вопрос оптимизации подключения для приложения с одним полем и кнопкой добавить не самый актуальный, но:
    Время создания и закрытия соединения с базой данных определяется вашими условиями. Если соединение с базой данных жизненно необходимо программе, и она сразу же грузит из неё данные и продолжает взаимодействовать всё время своего запуска, то в этом случае соединение создают и хранят до завершения программы.
    Для некоторых программ, которые точечно взаимодействуют с базой данных, а также если между взаимодействиями возможно отключение БД или доступа к ней по сети, соединения создаются в момент обращения к БД и после работы соединение закрывают. Это как раз очень похоже на ваш случай. При этом можно учитывать, что в действительности физические соединения к базе данных не всегда сразу закрываются при закрытии DbConnection, а придерживаются на случай, если тут же понадобится его открыть.
    С другой стороны, возможно сам факт ошибки соединения с БД уже сообщит пользователю о проблемах и ему не придётся узнавать это после заполнения многостраничной формы ввода. В этом случае желательно проверить соединение до ввода пользователя.
    Ответ написан
    1 комментарий
  • Как запустить WPF приложение из консоли?

    @Sumor
    using System;
    
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Starting WpfApplication1.exe...");
    
            var domain = AppDomain.CreateDomain("WpfApplication1Domain");
            try
            {
                domain.ExecuteAssembly("WpfApplication1.exe");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                AppDomain.Unload(domain);
            }
    
            Console.WriteLine("WpfApplication1.exe exited, exiting now.");
        }
    }
    Ответ написан
    2 комментария