Ответы пользователя по тегу C#
  • WPF. Какие элементы использовать в мессенджер-приложении?

    @Sumor
    Grid подразумевает размещение элементов в определённой сетке или равномерно по экрану. Он, по умолчанию, не предполагает прокрутки. Поэтому его нужно использовать для размещения известного количества известных элементов.
    StackPanel располагает элементы подряд. При превышении размера используется прокрутка. Элементы могут быть разного типа. В StackPanel каждым добавленным элемент нужно управлять индивидуально.
    ItemsControl по сути похож на StackPanel, но тут мы имеем централизованное управление элементами - через Items или ItemsSource.
    ListBox добавляет к ItemsControl возможность выделять элементы.

    Это весьма общая классификация: с помощью свойств, обработчиков, шаблонов можно при большом желании превратить одно в другое.

    В вашем случае, в зависимости от логики приложения можно предложить следующее.
    Если диалоги у вас в программе представлены списком (лучше BindingList или ObservableCollection), то их располагать в ItemsControl со StackPanel в качестве ItemsPanel. В шаблон элемента вы добавляете название, фотографию диалога и ListBox с сообщениями.
    Если не хотите заморачиваться с ItemsControl, то тогда использовать StackPanel, но тогда при добавлении диалога вам вручную придётся добавлять элементы для названия, фото и собщений.

    Можно ещё рассмотреть вариант с использованием TreeView, где в качестве первого уровня будут диалоги, а второго уровня - сообщения. Автоматом получаете закрытие/открытие диалогов.
    Ответ написан
    Комментировать
  • Как определить что элемент в рабочей области?

    @Sumor
    Поищите по ключевым словам treeview virtualization wpf
    В MSDN есть специальная статья: Повышение производительности TreeView
    Ответ написан
    Комментировать
  • Как правильно информировать о процессе выполнения задачи?

    @Sumor
    Практическое руководство. Фоновое выполнение операции

    Для выполнения продолжительной задачи нужно использовать BackgroundWorker.
    В событии DoWork описываете вашу длительную работу.
    В процессе работы (в обработчике DoWork) вызываете метод ReportProgress, чтобы сообщить в основную программу о состоянии обработки. В основную программу приходит событие ProgressChanged.
    Периодически отслеживаете не пытается ли кто остановить вашу работу через CancellationPending.

    Для запуска работы используете метод RunWorkerAsync. Через событие ProgressChanged отслеживаете прогресс и обновляете прогрессбар. По событию RunWorkerCompleted узнаёте о завершении или прерывании работы.
    Ответ написан
    1 комментарий
  • Как файлу передать параметры? И какая их максимальная длина?

    @Sumor
    Пример из MSDN
    using System;
    using System.Windows.Forms;
    
    class Sample 
    {
        public static void Main() 
        {
        String[] arguments = Environment.GetCommandLineArgs();
        MessageBox.Show(String.Join(", ", arguments));
        }
    }
    Ответ написан
    1 комментарий
  • Странности в работе SQLite на C#: почему некорректно выполняется запрос с параметром?

    @Sumor
    Не получится параметрами SQL задать названия колонок в SQL.
    У вас в итоге получился запрос
    SELECT 'id' FROM Cars
    Который и выполнился. Как вы и попросили: SQL отобрал записи из таблицы Cars (5 штук) и при выдаче каждой выдал строку 'id' как вы и просили.
    Колонки id в запросе нет. Есть безымянная колонка. Поэтому попытка выдать колонку, которой нет, приводит к IndexOutOfBoundsException.
    Ответ написан
    Комментировать
  • .NET 4.x Получить имя пользователя из AD, вида: Иванов Иван Иванович?

    @Sumor
    Есть два пути.
    Первый - через библиотеку System.DirectoryServices.dll (нужно дополнительно подключать в References (ссылки)).
    Использовать класс DirectoryEntry, DirectorySearcher.
    Второй - использовать ODBC драйвер к ActiveDirectory.

    При использовании обоих путей нужно учесть несколько необычную структуру и методы работы с ActiveDirectory.
    Например, для выдачи всех пользователей вам нужен запрос вида LDAP://CN=users,DC=server,DC=com
    Запрос через ODBC для выдачи имён пользователей должен выглядеть где-то так (нет возможности точно проверить):
    SELECT FullName FROM 'LDAP://CN=users,DC=server,DC=com'
    Ответ написан
    Комментировать
  • Как из MainForm.cs вынести DllImport в другой файл?

    @Sumor
    Ну во-первых, вы можете создать отдельный статический класс и там всё прописать.
    А во-вторых, если вы всё-таки хотите, чтобы внешние функции всё-таки были в классе MainForm, то не зря в объявлении класса указано слово partial. Оно говорит, что вы можете описывать класс в нескольких файлах. Для этого можно создать новый файл, начать его также: public partial class MainForm, и в него вынести внешние функции.
    Ответ написан
    1 комментарий
  • Как вытащить данные элемента с помощью LINQ to XML?

    @Sumor
    Для обозначения вектора раздумий предлагается следующий код:
    using System.Xml.XPath;

    foreach (var xe in xElement.XPathSelectElements(@".//*[КодСтроки=201 or КодСтроки=202 or КодСтроки=203]"))
    {                
        MessageBox.Show(xe.XPathSelectElement(@".//СуммаВсегоСначалаРасчетногоПериода[1]").Value);
    }
    Ответ написан
    Комментировать
  • Как сделать так, чтобы линии не перекрывали фигуры (Windows Forms)?

    @Sumor
    Собственно два варианта.
    1. Рисовать вершины в конце и заполнять их фоном через FillEllipse
    2. Так как размер вершины графа известен, то рисовать линии до границы вершины.
    Ответ написан
    3 комментария
  • Как вытащить данные из массива анонимных объектов?

    @Sumor
    <> у Select не нужно указывать - это элемент описания шаблонов: salaries.Select(s => s.Salary)
    Чтобы фильтровать нужно использовать предикат Where:
    var salaryQuery = salaries.Where(s => s.Region == "Регион" && s.KindOfActivity == "Виз занятий").Select(s => s.Salary);
    Ответ написан
    6 комментариев
  • Нужно ли использовать структуры в C#?

    @Sumor
    Используйте классы, если вы не видите преимуществ использования структур в вашем коде.
    Не уверен, что использование структуры со строкой внутри в листе быстрее использования аналогичного класса. Особенно по сравнению со временем доступа к СУБД.
    Подробнее про структуры в MSDN
    Структуры можно использовать:
    1. Если у вас связь с неуправляемым кодом, где ожидается подобная структура.
    2. Если вам критично использование value-типов.
    При этом нужно не забывать об особенностях их использования, например, что при присваивании или передачи в функцию структура копируется. Наверняка можно написать пример, где из-за этого производительность работы с большой структурой будет ниже, чем с классом.
    Ответ написан
    Комментировать
  • Как открыть шаблон Word, находящийся в ресурсе проекта (*.resx)?

    @Sumor
    Шаблон из ресурсов нужно сохранить куда-нибудь на диск, например, во временную папку, и указывать временный путь.
    Ответ написан
    1 комментарий
  • Почему не открывается диалог WPF?

    @Sumor
    В целом, то что вы закрыли диалог совершенно не означает, что ваша длительная операция прервалась.
    backgroundWorker.CancelAsync(); всего лишь информирует задачу, что её прерывают. Внутри обработчика backgroundWorker должна быть специальная проверка свойства CancellationPending, при установке которого нужно выполнять выход из потока обработки.
    Закрытие формы не уничтожает поток с задачей - она будет выполняться, пока не дойдёт до конца.
    Скорее всего при повторном открытии формы у вас происходит конфликт с ресурсами, которые уже используются первым потоком обработки.

    Если смотреть дальше, то если вы выполняете длительную операцию на сервере, например, длительную хранимую процедуру, то даже закрытие приложения, которое запустило на выполнение эту хранимку, не гарантирует остановку процесса на сервере. Особенно, если процесс изменяет данные. В зависимости от логики сервера процесс может продолжиться до победного конца, может прерваться в какой-нибудь ключевой момент или уйти в длительный откат изменений, чтобы привести всё в состояние до запуска хранимки.
    Ответ написан
    Комментировать
  • Как TextBox и компорт сделать в одном потоке?

    @Sumor
    Нужно переключиться, по необходимости, в поток, которому принадлежит TextBox.
    Для проверки используется функция CheckAccess(). Её нет в Intellisence (то есть в автодобавлении), но она нормально компилируется.
    Если вы находитесь не в нужном потоке, то для вызова кода в нужном используется функция Invoke, от объекта Dispatcher того объекта, в потоке которого нужно выполнить код.
    Код примерно такой (возможны синтаксические ошибки - нет под рукой студии):
    void AddText(string message)
    {
       if (!textbox.CheckAccess())
       {
           textbox.Dispatcher.Invoke(new Action<string>(AddText), message);
       }
       else
       {
           textbox.AppendText(message);
       }   
    }
    Ответ написан
    5 комментариев
  • Как сделать динамический список CheckBox в WPF ?

    @Sumor
    В простейшем случае это должно выглядеть где-то так:
    XAML:
    <ListBox x:Name="lst">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Value}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    В коде, например:
    lst.ItemsSource = new List<KeyValuePair<int, string>>()
    {
        new KeyValuePair<int, string>(1, "1"),
        new KeyValuePair<int, string>(2, "2"),
    };

    Данный код покажет вам ваш список с чекбоксиками. К чекбоксу можно привязать событие на изменение и отлавливать какой элемент зачекили или расчекили.
    При желании можно получить список отмеченных, но это не так тривиально.

    Лучше использовать для отображения объект у которого есть логическое свойство, например IsChecked, и его привязать к IsChecked CheckBox.
    Например:
    Класс:
    class MyClass
    {
        public int id { get; set; }
        public string Name { get; set; }
        public bool IsChecked { get; set; }
    }

    XAML:
    <ListBox x:Name="lst">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Добавление элементов:
    lst.ItemsSource = new List<MyClass>()
    {
        new MyClass(){id=1, Name="1"},
        new MyClass(){id=2, Name="2"},
    };

    В таком случае отметка пользователем галочки сразу отражается в привязанном списке и можно легко получить список отмеченных:
    foreach(var tObj in (lst.ItemsSource as List<MyClass>).Where(myObj => myObj.IsChecked))
        MessageBox.Show(tObj.Name);
    Ответ написан
    2 комментария
  • Есть ли простой в реализации алгоритм нахождения простых чисел?

    @Sumor
    Для больших чисел поиск решетом Эратросфена долгий, поэтому используется тест Ферма
    Подробнее и с реализацией
    Ответ написан
  • Как освободить память в C# в unsafe?

    @Sumor
    Я могу конечно сильно ошибаться, но что-то я тут не вижу выделения памяти.
    surfase — указатель, переменная освободится в конце блока.
    tmpSurface — кусок памяти, существующий до и после блока. Как он был получен, так и освобождать, — вне блока unsafe.
    textureWidth, textureHeight — внешние, относительно блока, переменные. Скорее всего числовые. Их управлением также занимается кто-то другой вне этого блока.
    surfase->w, surfase->h — скорее всего здесь просто присваивание и выделения памяти не происходит.
    Ответ написан
  • Можно ли избежать принудительного возврата false в C#?

    @Sumor
    В C# функция во всех возможных путях выполнения должна либо возвратить какое-либо значение возвращаемого типа, либо вызвать исключение.
    В вашем случае я вижу три варианта:
    1. Оставить всё как есть. Удобно, если нужно в случае отсутствия ключа возвращать значение по-умолчанию.
    2. Возвращать вместо bool объект типа Nullable (короткая запись bool?). В этом случае последний оператор будет return null. И вызывающие эту функцию будут знать, что либо возвратится значение, либо, если ключ не найден, — null.
    3. Вызывать исключение. Например, throw new ArgumentOutOfRangeException("Ключ не найден");
    В таком случае вызывающие должны уметь обрабатывать ситуацию, когда вызовется исключение.
    Ответ написан
    Комментировать