Ответы пользователя по тегу C#
  • Задали написать свой Mutex на C#, как лучше?

    @cicatrix
    было бы большой ошибкой думать
    WaitHandle нельзя пользоваться? Мне while не сильно нравится, посмотрите на загрузку процессора с вашим циклом ожидания и WaitHandle
    Ответ написан
  • Есть ли возможность извлечь данные из файла .dwg, используя C#(желательно в excel)?

    @cicatrix
    было бы большой ошибкой думать
    Вот какая-то либа, но платная. Бесплатные наработки можно попытаться поискать на гитхабе или codeproject или sourceforge

    Вот ещё пакеты из NuGet
    Ответ написан
    Комментировать
  • Событие что ты нажал на иконку приложения в панели задач?

    @cicatrix
    было бы большой ошибкой думать
    Клик по иконке в панели задач приводит к запуску приложения. Если ваше приложение уже запущено, запустится ещё одна копия.
    Если вы хотите, чтобы ваше приложение запускалось только единожды (в одном экземпляре), то есть несколько подходов - либо создавать в системе мьютекс, и удерживать его до выхода (при повторном запуске, если мьютекс занят, завершать приложение), вот здесь описано подобное решение. (Там же приведён код активации окна уже запущенного приложения, если оно свёрнуто).
    Альтернативно, можно смотреть список запущенных процессов, искать свой процесс, и выходить, если найден.
    Либо в качестве мьютекса можно использовать любой блокирруемый системный ресурс (например, файл), но это не правильно.
    Ещё можно использовать именованный канал (named pipe), но это более громоздкое решение, и его следует использовать только если вам нужно осуществлять коммуникации между несколькими копиями вашего приложения.
    Ответ написан
    4 комментария
  • Как запретить изменение положения курсора в textbox?

    @cicatrix
    было бы большой ошибкой думать
    Вопрос - зачем? Скорее всего, вы используете textbox не по назначению. Если нужно построчное выделение, лучше используйте ListBox или DataGridView.
    Если просто хотите показать текст - Label

    Ну, а если месье знает толк в извращениях, тогда наследуйте от класса Form, ловите все сообщения к текстбоксу:
    public override bool PreProcessMessage(ref Message msg)
    {
       
    }

    и фильтруйте те, которые управляют курсором (клики мышью, нажатия клавиш, и пр.)
    Ответ написан
    2 комментария
  • Каким костылем можно узнать что завершены/заснули все потоки ThreadPool?

    @cicatrix
    было бы большой ошибкой думать
    Я обычно сохраняю ссылку на каждый экземпляр потока (объект Thread) в коллекции или массиве. Там можно проверять свойство IsAlive, ну и прибить тоже можно, если нужно (метод Abort() )
    Ответ написан
    Комментировать
  • Как создать COM-объект в программе на C#?

    @cicatrix
    было бы большой ошибкой думать
    Это называется Runtime Callable Wrapper или RCW.
    В большинстве случаев после регистрации COM компонента (в вашем списке под №1) достаточно просто добавить в проект ссылку на этот компонент (Add Reference) и импортировать пространство имён.
    От себя лишь добавлю, что работа с COM может приводить к утечкам памяти - сборщик мусора там не всегда справляется, так что подчищайте память за собой после работы.

    "Под капотом", если на пальцах, то CLR сгенерит "обёртку" вашего COM объекта (wrapper assembly), с которой вы и будете работать. Никаких CreateObject делать не надо (это для PowerShell или VBS больше актуально).
    Ответ написан
  • Работа с большим изобилием форм?

    @cicatrix
    было бы большой ошибкой думать
    Смотря сколько всего форм.
    Можно и не заморачиваться сильно. Достаточно Ссылку на первую (1), как я понял (Activation) хранить где-нибудь глобально, чтобы все формы видели (например, в классе Program.MainForm);
    В событии Activated просто делать Program.Form1.Hide(); а в событиях Closing или Closed делать Program.Form1.Show()

    Ну и да, если форм много, то тогда проще расширить класс Form -
    public abstract class MyForm : Form
    {
        protected override void OnActivated(EventArgs e)
        {
            base.OnActivated(e);
            // TODO: Убедиться, что MainForm != null
            // System.Diagnostics.Debug.Assert(null != Program.MainForm);
            Program.MainForm.Hide(); 
        } // OnActivate
    
        protected override void OnDeactivate(EventArgs e)
        {
            base.OnDeactivate(e);
            // TODO: Убедиться, что MainForm != null
            // System.Diagnostics.Debug.Assert(null != Program.MainForm);
            Program.MainForm.Show(); 
        } // OnDeactivate
    } // class MyForm


    В общем, потом достаточно прописать в своей форме наследование не от Form, а от MyForm и всё. Любая форма будет вести себя так.
    Если "MainForm" может изменяться от раза к разу, то её в конструктор новой формы надо будет передавать.
    Ответ написан
    Комментировать
  • Прорисовка объекта в C#?

    @cicatrix
    было бы большой ошибкой думать
    Вы должны рисовать на объекте Graphics, который вам предоставляет Form_Paint.
    При срабатывании события Paint в аргументе PaintEventArgs вам будет передан объект Graphics, при помощи которого и надо производить отрисовку.
    Ответ написан
    1 комментарий
  • Пропали все компоненты с формы, в чем причина?

    @cicatrix
    было бы большой ошибкой думать
    Посмотрите в файл formname.Designer.cs. Для всех компонент, которые вы добавляете на форму, в этом файле автогенерируется код по их добавлению.
    Проблема, видимо, в том, что что-то глючит. Попробуйте создать новую форму, и копипастом перенесите программный код из основного модуля (FormName.cs) и (обязательно!) из FormName.Designer.cs в новую форму.

    Можно просто в форме CTRL+A, CTRL+C
    В новой: CTRL-A, CTRL-V

    UPD: Забыл сказать - обязательно проверьте наличие вызова InitializeComponent() в Form_Load. Судя по симптомам, скорее всего, InitializeComponent не выполняется.
    Ответ написан
    Комментировать
  • Как отправить HTML/CSS письмо на электронную почту?

    @cicatrix
    было бы большой ошибкой думать
    А чем стандартный способ отправки через System.Net.Mail.SmtpClient не понравился?
    Ответ написан
  • Как избежать выхода числового id за пределы диапазона?

    @cicatrix
    было бы большой ошибкой думать
    Если это про базу данных и поле id размерностью в tinyint, то проще вообще убрать identity и присваивать id самостоятельно явным образом.
    Ответ написан
    Комментировать
  • Возможно ли перенести exe программу с SQL базой на другой компьютер?

    @cicatrix
    было бы большой ошибкой думать
    Берёте IL spy, декомпилируете exe сборку, ищете, куда зашит пароль.
    Ответ написан
    Комментировать
  • Как получить Guid только добавленного элемента?

    @cicatrix
    было бы большой ошибкой думать
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        string sqlText = "INSERT INTO [Library] (Title, Tags, Body) OUTPUT INSERTED.[Id] VALUES(@Title, @Tags, @Body)";
        using (SqlCommand cmd = new SqlCommand(sqlText, conn))
        {
            cmd.Parameters.AddWithValue("Title", title);
            cmd.Parameters.AddWithValue("Tags", tags);
            cmd.Parameters.AddWithValue("Body", body);
                        
            try
            {
                conn.Open();
                Guid insertedGuid = (Guid)await cmd.ExecuteScalarAsync(); // <-- созданный GUID
            }
            finally
            {
                conn.Close();
            }                    
        } // using cmd
    } // using conn
    Ответ написан
    7 комментариев
  • Как реализовать строчную отладку кода в C#?

    @cicatrix
    было бы большой ошибкой думать
    Кирилл Серов, это одна из причин, по которой не стоит без абсолютно крайней необходимости заниматься метапрограммированием. Собственно, выходов у вас особо нет, либо нагромождать тестовый стенд, который в момент перехода к исполнению вашего сгенерированного текста остановит программу, скинет ваш код в файл, вы его загрузите в отладчик, проинициализируете все переменные и объекты, и отладите.
    Второе - раз уж вы интегрируетесь с экселем, рассмотрите VBA в качестве вашего скриптового языка.
    Третье - файловый ввод-вывод и пошаговое логирование в момент исполнения вашего кода со всей интересующей вас информацией.
    И повторюсь, рассмотрите возможность отказаться от генерации компилируемого кода, используйте хотя бы любой скриптовой язык (vbs, js, ps1, python, и т. д.).
    Ответ написан
    Комментировать
  • Как сделать метод для разных форм?

    @cicatrix
    было бы большой ошибкой думать
    Проще сделать отдельный класс (можно статический), в нём сделать метод, который бы принимал на вход в качестве параметра ссылку на ваш DataGridView, да и делал бы с ним, что нужно.

    internal static class Helper
    {
          internal static void SetUpGridView(DataGridView dgv)
         {
           // ... делайте всё здесь
         }
    } // class Helper

    Ну а в классе формы просто:
    Helper.SetUpGridView(this.DataGridView1);
    Ответ написан
    1 комментарий
  • Как на C# реализовать асинхронную очередь задач у объекта?

    @cicatrix
    было бы большой ошибкой думать
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace TasksSample
    {
        public class Worker
        {
            private int id;
            public Worker(int id)
            {
                this.id = id;
            }
            public void DoHardWork()
            {
                Console.WriteLine($"Task {this.id} started.");
                Random rng = new Random();
                int delay = rng.Next(1000, 10000);
                Thread.Sleep(delay);
                Console.WriteLine($"Task {this.id} finished after {delay} ms.");
            } // DoHardWork
        } // class Worker
    
        class Program
        {
            static void Main(string[] args)
            {
                TaskFactory fact = new TaskFactory();
                int TaskCount = 10;
                List<Task> myTasks = new List<Task>();
                for (int id = 0; id < TaskCount; ++id)
                {
                    Worker w = new Worker(id);
                    myTasks.Add(fact.StartNew(() => w.DoHardWork()));
                }
                Task.WaitAll(myTasks.ToArray());
            } // void Main
        } // class Program
    } // namespace TasksSample
    Ответ написан
    2 комментария
  • После чтение файла происходит сложение значений из файла, на выход неожидаемый результат, почуем?

    @cicatrix
    было бы большой ошибкой думать
    StreamReader по умолчанию открывает файл в кодировке UTF-8 и считает, что в одном символе 2 байта.
    Вам явно указывать кодировку файла в инициализации StreamReader.
    И вообще, хорошей практикой будет считать строку (ReadLine), потом уже производить её разбор.
    И, как я уже указал в комментарии, приведение Char к Int32 вернёт код символа, а не строковое значение.
    Для того, чтобы превратить символ "3" в число 3 надо пользоваться методом Parse.
    Ответ написан
    Комментировать
  • Как правильно называть следующий синтаксис?

    @cicatrix
    было бы большой ошибкой думать
    Полю Age экземпляра my класса MyClass присвоено значение 5.
    Класс MyClass
    Экземпляр класса - my
    Поле - Age

    У класса могут быть как статические члены (поля, свойства, методы), так и не статические. Особняком стоят константы, делегаты и перечисления, для которых слово static как бы подразумевается.
    Ответ написан
    6 комментариев
  • Как добавить файл в БД access, а потом его достать?

    @cicatrix
    было бы большой ошибкой думать
    Считываете файл в байтовый массив, потом insert его в поле типа binary, abinary или bigbinary.
    Считываете обычным select и пишете в файл.
    Да, вам надо сохранять ещё и имя файла и его атрибуты (если это важно).

    Но вообще, если есть возможность, я бы заменил Access на любую другую RDBMS (С C# можно прекрасно обходиться SQLEXPRESS, например).
    Ответ написан