Smeezy Ответов: 2

Редактирование текста в многострочном текстовом поле


У меня есть буквы, символы и цифры. Каждый из них имеет свой собственный ярлык. У меня есть событие щелчка на каждой метке, которое добавляет все, что находится в метке, в многострочное текстовое поле.

Проблема в том, что независимо от того, где находится каретка, когда я редактирую текст, удаляя что-то, а затем щелкаю метку, чтобы добавить новый элемент в текстовое поле, он всегда помещает его в конец последней строки, а не туда, где находится каретка.

Я знаю, что это потому, что я говорю это через событие щелчка, как это:

private void lblCbore_MouseClick(object sender, MouseEventArgs e)
        {
            txtFCF.Text += lblCbore.Text;
        }


Как я могу сказать ему, чтобы он поместил элемент, который я нажимаю, туда, где находится каретка, а не в конец последней строки?

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

Все, что я сделал, это использовал многострочное текстовое поле. Я не ожидал, что он не будет работать как однострочное текстовое поле. Я искал ответ в google и здесь.

CHill60

Когда вы говорите "редактировать его", вы имеете в виду вручную ввести его или вы имеете в виду программно. Если последнее вам нужно будет показать нам код

Smeezy

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

2 Ответов

Рейтинг:
19

OriginalGriff

Это довольно просто: позиция курсора в текстовом поле задается свойством SelectionStart:

private void MyButton_Click(object sender, EventArgs e)
    {
    int pos = myTextBox.SelectionStart;
    string str = "The new text. ";
    myTextBox.Text = myTextBox.Text.Insert(pos, str);
    myTextBox.SelectionStart = pos + str.Length;
    }


Smeezy

Я действительно попробовал как код, который вы предоставили, так и этот,

private void lblY_MouseClick(отправитель объекта, MouseEventArgs e)
{
txtFCF.Text = txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblY.Текст);
};

Они оба работали одинаково. Однако каретка возвращается к концу последней строки после того, как я что-то удаляю, а не остается там, где был удален элемент. Есть ли способ предотвратить это?

OriginalGriff

Вы должны помнить, что строки неизменяемы: единственный способ добавить или удалить текст из строки-это создать новую и использовать ее.

Но каретка управляется свойством StartPosition, и если вы специально не зададите ее - как это делает мой код - она всегда будет помещена в конец строки, Когда вы зададите свойство Text. Так что сначала сохраните его - как я сделал - и установите после - как я сделал.

Smeezy

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

private void lblLeft_MouseClick(отправитель объекта, MouseEventArgs e)
{
//txtFCF.Text = txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblLeft.Текст);

int pos = txtFCF.Объект selectionstart;
строка str = lblLeft.Text;
txtFCF.Text = txtFCF.Text.Вставка(pos, str);
txtFCF.SelectionStart = pos + str.Длина;
}

частная lblMid_MouseClick недействительным(объект отправителя, MouseEventArgs е)
{
//txtFCF.Text = txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblMid.Текст);

int pos = txtFCF.Объект selectionstart;
строка str = lblMid.Text;
txtFCF.Text = txtFCF.Text.Вставка(pos, str);
txtFCF.SelectionStart = pos + str.Длина;
}

lblRight_MouseClick частная недействительным(объект отправителя, MouseEventArgs е)
{
//txtFCF.Text = txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblRight.Текст);

int pos = txtFCF.Объект selectionstart;
строка str = lblRight.Текст;
txtFCF.Text = txtFCF.Text.Вставка(pos, str);
txtFCF.SelectionStart = pos + str.Длина;
}

OriginalGriff

Ни один из этих кодов ничего не удаляет!
Поэтому посмотрите на свой метод "удаления" и используйте SelectionStart.

Smeezy

Извините, я мог бы сказать это сбивчиво. Он ничего не удаляет. Когда я удаляю, например, букву "А" из второй строки, каретка автоматически переходит в конец последней строки, будь то строка 3 или 4. можно ли это предотвратить? В остальном все работает как надо.

OriginalGriff

:голова: :стол: :Бах:
Так приятно, когда ты останавливаешься ...

Прочтите, что вы написали. Затем прочтите его еще раз, с точки зрения того, кто не видит ваш код, не может запустить ваше приложение и получает только *точно* то, что вы вводите для работы.

Затем попытайтесь найти способ объяснить, как код, который вы показываете, имеет какое - то отношение к удалению, когда вы говорите, что это не так - и я согласен, что это не так, - но затем продолжайте, как будто это так ... :вздох:

Smeezy

"Код" не имеет никакого отношения к удалению, и он работает так, как должен. Я говорю о физическом удалении символа с клавиатуры. Представьте себе на мгновение, что вы используете его сами, и вы обнаружите, что у вас есть опечатка в строке 18 из 125 строк. Вы можете удалить все в поле и начать все сначала, или вы можете либо вернуться назад, либо нажать кнопку Удалить, чтобы удалить оскорбительный символ. Если вы вернетесь назад или удалите курсор, он автоматически переместится в конец строки 125, когда он должен оставаться там, где он есть, чтобы вы могли ввести правильный символ. Кто хочет прокрутить 125 строк текста, чтобы найти, где они удаляют букву "Е"?

Итак, опять же, на данный момент в коде нет ничего плохого. У него просто есть дополнительная причуда, которую, я надеюсь, можно устранить. Я надеюсь, что это было достаточным объяснением.

OriginalGriff

Это не то, что происходит со стандартным, немодифицированным многострочным текстовым полем.
Добавить новое поле в форму, назовем ее "myTextBox"
Установите его на многострочный режим.
Добавьте этот код в свою форму.Показанное Событие:

myTextBox.Lines = новая строка[] { "привет","там", "разработчик"};

Добавьте кнопку в форму, обработайте событие щелчка и добавьте код, который я дал в исходном решении.

Запустить его. Поместите каретку над средней буквой "Е" в графе "там". Нажать кнопку.
Линия изменится на:

thThenewText. где

С кареткой над оригинальной буквой "Е". нажать клавишу del. "е" пойдет, а каретка будет над "Р".
Поместите курсор в любом месте текстового поля, и delete и backspace будут работать именно так, как вы ожидаете.

Теперь спросите себя: "что я добавил в свое текстовое поле, из-за чего оно пошло не так, и почему я не показал этот код людям на CodeProject вместо кода, который не имеет никакого отношения к проблеме?"

Smeezy

Рад сообщить, что теперь все это работает правильно! Я ценю вашу помощь.

int pos = txtFCF.Объект selectionstart;
строка str = lblP.Text;
txtFCF.Text = txtFCF.Text.Вставка(pos, str);
txtFCF.SelectionStart = pos + str.Длина;

Мне действительно нужно было сохранить это в событии textchanged в текстовом поле. Без него каретка продолжала двигаться в исходное положение.

txtFCF.Объект selectionstart = txtFCF.Текст.Длина;
txtFCF.SelectionLength = 0;

OriginalGriff

Всегда пожалуйста!

Рейтинг:
0

Gerry Schmitz

txtFCF.Text += lblCbore.Text;

Это не то, как вы "вставляете"; вы явно "добавляете".

Считать это:

Как найти положение курсора в текстовом поле? C# - Переполнение Стека[^]


Smeezy

Я только что попробовал это сделать, но ничего не вышло

txtFCF.Text += txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblFinish.Текст);

Каждый элемент, который я нажимаю, объединяется, чтобы сформировать то, что называется "рамкой управления функциями".

Он работает по мере необходимости, если я использую только одну строку, но было бы более полезно, если бы я мог заставить это работать.

Smeezy

Ладно, думаю, я только что это понял. Мне нужно устранить += и просто использовать =. Это верно?

CHill60

Нет - вы перепишете текст - см. Решение 2 - Используйте текст.Вставить

Smeezy

I surely appreciate your help OriginalGriff, but if I knew what code was giving me the problem, and why, I wouldn't need to ask for help. Originally my question was simply to ask about the multiline textbox. I’m not familiar with it at all. I didn’t know if this is just how it works. I’m not a professional either. I know just enough to get by, and this is a personal use item to make my real job more efficient. This is basically all of my code. There are about 40 similar statements like the first two. I only posted two to condense it. I’m going to try what you laid out for me. In the meantime, can you tell me where my problem is in this code? Even if I get your code to work as I need, I’d like to know what I did wrong in mine so I can learn something here. I don’t expect it to be done for me, that’s not going to help me learn. The only things missing from this are the close button, and a newline button, both of which work fine. I thought they would just clutter things. So my problem has to be somewhere in the code below.

private void lblCbore_MouseClick(отправитель объекта, MouseEventArgs e)
{
txtFCF.Text = txtFCF.Text.Вставить(txtFCF.Объект selectionstart, lblCbore.Текст);
}

private void lblDiameter_MouseClick(отправитель объекта, MouseEventArgs e)
{
txtFCF.Текст += lblDiameter.Текст;
}

частная btnCopy_Click недействительным(объект отправителя, EventArgs в электронной)
{
if(txtFCF.Текст == "")
{
//это просто для того, чтобы предотвратить ошибку. Сообщение не требуется.
}
еще
Буфер обмена.Помощью setText(txtFCF.Текст);
txtFCF.Текст = "";
txtFCF.Сосредоточить();
}

частная btnBackspace_Click недействительным(объект отправителя, EventArgs в электронной)
{
if(txtFCF.Текст == "")
{
//это просто для того, чтобы предотвратить ошибку. Сообщение не требуется.
}
еще
txtFCF.Text = txtFCF.Text.Remove(txtFCF.Text.Length - 1, 1);
}
// Объяснение приведенного ниже кода. До того как я нашел это решение с помощью поиска, каретка возвращалась к началу первой строки каждый раз, когда я вводил текст. Он поместит введенный текст в конец, но каретка останется в начале. Тем не менее, если бы я удалил любую букву, она добавила бы следующую букву в конец последней строки (та же проблема, что и сейчас). Все, что сделал приведенный ниже код, - это не позволил каретке остаться в начале первой строки.
частная txtFCF_TextChanged недействительным(объект отправителя, EventArgs в электронной)
{
txtFCF.Объект selectionstart = txtFCF.Текст.Длина;
txtFCF.SelectionLength = 0;
}