Member 11494390 Ответов: 3

Как изменить цвет выделения в richtextbox после пересечения лимита символов 60


Я создаю проект приложения windows, где мне нужно создать RichTextbox с меткой количества символов.

Мое требование заключается в том, что пользователь может ввести до 80 символов в RichTextbox, но только первые 60 символов могут быть сохранены в базе данных. Я хочу отобразить набранные символы > 60 красным цветом.

Используя приведенный ниже код, он отображает превышение символов красным цветом от 62-го символа, он должен отображаться от 61-го символа.

В некоторых тестовых случаях компонент работает неправильно.

Например:
После ввода 65 символов последние 5 символов должны отображаться красным цветом, после удаления первых двух символов значение счетчика уменьшается, но цвет последних 5 символов все еще отображается красным цветом, в идеале он должен отображать последние 3 символа красным цветом, который превысил предел 60.

Что я уже пробовал:

Пожалуйста, проверьте приведенный ниже код и помогите мне решить эту проблему.
// Variables
int Typed_Characters_Count=0;
int Remain_Characters_Count=0;
int maxAllowedCharacters = 60;
string charactersToSave="";


Я использовал логику как показано ниже в событии RichTextbox Textchanged:
private void txt_wordbox_TextChanged(object sender, EventArgs e)
{
            Typed_Characters_Count = txt_wordbox.TextLength;
            
            if (Typed_Characters_Count == 0)
            {
                // Default 
                lbl_Header.Text = "Add Work Item";
                lbl_Counter.Text = maxAllowedCharacters + "/" + maxAllowedCharacters;
                lbl_Counter.ForeColor = Color.Black;
                Btn_Save.Enabled = false;
            }
            else if (Typed_Characters_Count >= 1 && Typed_Characters_Count <= 60)
            {
                if (string.IsNullOrWhiteSpace(txt_wordbox.Text) && txt_wordbox.Text.Length > 0)
                {
                    Btn_Save.Enabled = false;
                    lbl_Header.Text = "Add Work Item";
                    Remain_Characters_Count = maxAllowedCharacters - Typed_Characters_Count;
                    lbl_Counter.Text = Remain_Characters_Count.ToString() + "/" + maxAllowedCharacters;
                    lbl_Counter.ForeColor = Color.Black;
                }
                else
                {
                    Btn_Save.Enabled = true;
                    lbl_Header.Text = "To save, click save icon";

                    // Save the selection's start and length.

                    int sel_start = txt_wordbox.SelectionStart;
                    int sel_length = txt_wordbox.SelectionLength;

                    CultureInfo culture_info = Thread.CurrentThread.CurrentCulture;
                    TextInfo text_info = culture_info.TextInfo;
                    txt_wordbox.Text = text_info.ToTitleCase(txt_wordbox.Text);

                    // Restore the selection's start and length.

                    txt_wordbox.Select(sel_start, sel_length);

                    Remain_Characters_Count = maxAllowedCharacters - Typed_Characters_Count;
                    lbl_Counter.Text = Remain_Characters_Count.ToString() + "/" + maxAllowedCharacters;
                    lbl_Counter.ForeColor = Color.Black;
                }
            }
            else if (Typed_Characters_Count > 60)
            {
                
                lbl_Header.Text = "Reduce Characters to 60";
                Remain_Characters_Count = maxAllowedCharacters - Typed_Characters_Count;
                lbl_Counter.Text = Remain_Characters_Count.ToString() + "/" + maxAllowedCharacters;
                lbl_Counter.ForeColor = Color.Red;
                lbl_Header.ForeColor = Color.Red;
                txt_wordbox.SelectionColor = Color.Red;
            }

3 Ответов

Рейтинг:
2

Wendelius

Почему бы не изменить цвет на основе выбора, когда количество символов превышает лимит. Что-то вроде

...
         } else if (Typed_Characters_Count > 60) {
            int sel_start = txt_wordbox.SelectionStart;
            int sel_length = txt_wordbox.SelectionLength;

            txt_wordbox.Select(60, 99999);

            lbl_Header.Text = "Reduce Characters to 60";
            Remain_Characters_Count = maxAllowedCharacters - Typed_Characters_Count;
            lbl_Counter.Text = Remain_Characters_Count.ToString() + "/" + maxAllowedCharacters;
            lbl_Counter.ForeColor = Color.Red;
            lbl_Header.ForeColor = Color.Red;
            txt_wordbox.SelectionColor = Color.Red;

            // Restore the selection's start and length.
            txt_wordbox.Select(sel_start, sel_length);
         }
....


Рейтинг:
2

RickZeeland

Я могу порекомендовать вам эту действительно хорошую альтернативу: Быстрое цветное текстовое поле для подсветки синтаксиса[^]
Я даже использовал его для утилиты сравнения XML-файлов !


BillWoodruff

Мой голос №1: это не имеет никакого отношения к вопросу ОП.

RickZeeland

Тогда у нас есть разные мнения о том, что полезно, я думаю, что никогда больше не буду использовать стандартный richtextbox !

BillWoodruff

В данном случае у нас нет разных мнений. Вы слишком часто злоупотребляете этим форумом с ответами не по теме.

RickZeeland

Может быть, вы назовете несколько примеров, теперь мне становится любопытно ...

RickZeeland

Может быть, вы имели в виду мой "евангелизм PostgreSQL", который раздражал многих Микрософтов :)
В любом случае спасибо, что не был анонимным даунвотером ...

Рейтинг:
0

BillWoodruff

Я думаю, что ваша дизайнерская идея здесь ущербна:

1. Вы можете установить свойство 'MaxLength либо RichTextBox, либо TextBox, чтобы ограничить количество символов. Почему вы хотите, чтобы пользователь вводил больше символов, чем вы будете использовать ?

2. В WinForms, я бы реализовать это как элемент управления UserControl с меткой и текстовое поле:

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class TbxLimited : UserControl
    {
        public TbxLimited()
        {
            InitializeComponent();
        }

        public int TbxLimited_MaxLength
        {
            set { textBox1.MaxLength = value; }
            get { return textBox1.MaxLength; }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            label1.Text = textBox1.Text.Length.ToString();
        }
    }
}
Предоставляя общедоступное свойство TbxLimited_MaxLength, вы включаете контроль времени разработки над ограничением символов.