Ответы пользователя по тегу Windows Forms
  • Как в C# реализовать изменение свойств нескольких компонентов в чужом потоке?

    aush
    @aush
    Я не уверен, что правильно понял ваш вопрос, но попробую предположить, что вы считаете, что Invoke должен вызываться у того контрола, действия с которым вы хотите совершить. Это не так - вы можете вызвать Invoke на любом контроле, который работает в том UI-потоке, контролы в котором вы хотите изменить.

    Т.е. вы можете делать так:

    private void AddTag(bool onstart)
    {
        if (tagList.InvokeRequired)
            tagList.Invoke(new Action(() => BlockUI(onstart)));
        else
            BlockUI(onstart);
    }


    Вместо tagList может быть любой контрол, работающий в этом UI-потоке. Например, пусть у вас на форме три кнопки:

    private void button1_Click(object sender, System.EventArgs e)
    {
    	var t = new Thread(new ThreadStart(() =>
    	{
    		if (button3.InvokeRequired)
    		{
    			button3.Invoke(new Action(() =>
    			{
    				button1.Text = "new button1 name";
    				button2.Text = "new button2 name";
    				button3.Text = "new button3 name";
    			}));
    		}
    		else
    		{
    			button1.Text = "new button1 name";
    			button2.Text = "new button2 name";
    			button3.Text = "new button3 name";
    		}                
    	}));
    	t.Start();
    }


    Кстати, форма тоже является контролом, так что в этом примере можно писать и так:

    private void button1_Click(object sender, System.EventArgs e)
    {
    	var t = new Thread(new ThreadStart(() =>
    	{
    		if (InvokeRequired)
    		{
    			Invoke(new Action(() =>
    			{
    				button1.Text = "new button1 name";
    				button2.Text = "new button2 name";
    				button3.Text = "new button3 name";
    			}));
    		}
    		else
    		{
    			button1.Text = "new button1 name";
    			button2.Text = "new button2 name";
    			button3.Text = "new button3 name";
    		}                
    	}));
    	t.Start();
    }
    Ответ написан
    4 комментария
  • Как можно ускорить кастомную отрисовку в WinForms?

    aush
    @aush
    Не надо так делать. У вас куча логики на отрисовку, конечно, это будет дико медленно работать.

    Возьмите стандартный RichTextBox и сделайте как-то так:
    richTextBox1.Text = "blah blah meeh";
    richTextBox1.SelectionStart = 5;
    richTextBox1.SelectionLength = 4;
    richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, FontStyle.Underline);
    // еще варианты:
    //richTextBox1.SelectionColor = Color.Red;
    //richTextBox1.SelectionBackColor = Color.Yellow;
    //повторить для все слов с ошибками


    Если критично, чтобы отображение было стандартным (красная волновая линия под черным текстом), то расширьте RichTextBox: geekswithblogs.net/pvidler/archive/2003/10/15/188.aspx
    Ответ написан
  • Нужно ли отписываться от событий в .net winforms app?

    aush
    @aush
    Нельзя дать общий ответ на этот вопрос.

    Обычно, когда вы в конструкторе (или на Load) формы подписываетесь на события чайлдовых контролов, отписываться от них нет необходимости.

    Но, если обработчик события содержит ссылку на объект, время жизни которого меньше времени жизни формы, то он не будет собран сборщиком мусора до того, как произойдет отписка от события. В этом случае, у вас должно быть какое-то событие, по которому вы сможете определить, что объект больше не используется и в ответ на это событие очистить ваши подписки.

    Проще говоря, инициатором очистки подписки будет некая третья сторона. В designer.cs вашей формы уже есть Dispose(), который обычно и вызвается "третьей стороной" (WinForms фреймворком), поэтому вам не нужно об этом задумываться в большинстве случаев.

    Скорее всего, если у вас сейчас возникает такой вопрос, то вам действительно не стоит задумываться об отписке от таких событий, а когда у вас появится задача соответствующего уровня, вы уже сами сможете разобраться, когда нужно отписываться.
    Ответ написан
    Комментировать
  • Grid для .NET WinForms?

    aush
    @aush
    Очевидно, тут есть логическая ошибка. Если вы выводите что-то пользователю, то предполагается, что он с этим реально будет взаимодействовать. Ваш пользователь действительно может просмотреть хотя бы 1млн из 20млн ваших записей?

    Пересмотрите логику работы вашего приложения, выводить даже "20-30 тыс. строк" - это уже очень странный юзкейс, не то что ваш пример.
    Ответ написан