2015-11-23 1 views
0

Для Windows Forms.RichTextBox, вставляющий текст

Я пытаюсь вставить текст в поле .rtf RichTextBox.

Я пробовал два метода. Когда я использую .Rtf.insert, ничего не происходит вообще.

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

Но зная, в чем проблема (если я прав) не помог мне ее решить.

Есть ли способ получить .rtf.insert для правильной работы или есть способ перевести выбранные текстовые индексы в фактические текстовые позиции .rtf, чтобы что-то вроде кода ниже работало? Я предполагаю, что сам RichTextBox должен знать, как перевести один индекс в другой, потому что он может вставлять символы, когда пользователь набирает просто отлично.

Вот мой фрагмент кода. Точка кода заключается в том, чтобы вставить маркер в текст, который позже будет разобран и заменен на имя ученика. Будут и другие подобные коды. «codeLeader» и «codeEnder» - это просто строки, которые я использую для окружения кодов. В этом случае я использую «[*» и *] », чтобы указать, что есть код, который мне нужно будет анализировать, но я помещаю их в отдельные строки, чтобы я мог легко изменить его, если захочу. код синтаксического анализа, который отлично работает в расширенном тексте, просто вставляет текст в сам richTextBox. Другими словами, если бы я вручную вводил коды, это было бы очень хорошо. хлопотно для пользователя, так как некоторые из кодов будут использовать индексные номера.

private void studentFirstNameCode_Click(object sender, EventArgs e) 
{ 
    string ins = f1ref.codeLeader; 
    ins += "SNFirst" + f1ref.codeEnder; 
    int start = editorField.richTextBox1.SelectionStart; 
    if (start == -1) { start = 0; } 
    int end = start + editorField.richTextBox1.SelectionLength; 
    if (end == -1) { end = 0; } 
    string pre = editorField.richTextBox1.Rtf.Substring(0, start); 
    string post = editorField.richTextBox1.Rtf.Substring(end); 
    string newstring = pre + ins + post; 
    editorField.richTextBox1.Rtf = newstring; 
    // this also doesn't work. gives no result at all. 
    // editorField.richTextBox1.Rtf.Insert(start, newstring); 
} 
+0

http://stackoverflow.com/questions/4795709/how-to-convert-a- string-to-rtf-in-c вам нужно понять, как преобразовать 'Strings в формат RTF' – MethodMan

+0

Я не понимаю, зачем вам это нужно с RTF t доб. Не могли бы вы объяснить это? Кажется, что вы не заменяете текст каким-либо образом RTF, а просто текстовый – Steve

+0

Мне нужно сделать это, потому что другие части текста отформатированы в rtf. Пользователь может редактировать текст, изменять цвет, менять размер шрифта, использовать маркеры и т. Д. В определенных местах я хочу, чтобы пользователь мог нажать кнопку вставить немного текста так же, как если бы он/она набрал его. Это все. – Popinjay

ответ

0

Я нашел работу вокруг с помощью .SendKeys. Это делает текст появляется немного медленно (как будто набирается очень быстро), так что ISN Оптимально, но он действительно работает.

Этого достаточно для работоспособного решения, но я все еще обеспокоен этой проблемой. Похоже, что этот вопрос должен иметь более элегантное решение, чем это.

+0

Ответ Стива был лучшим. Благодаря! – Popinjay

1

Я не думаю, что вам нужно использовать свойство RTF для простого вставки текста внутри фактического текста RichTextBox. В частности, поскольку вы, похоже, не добавляете RTF-форматированный текст.

Если вы не хотите использовать формат RTF, то самый простой способ для достижения своей цели только одна строка кода

editorField.SelectedText = yourParameterText; 

Это будет работать, как вы вставили текст из буфера обмена в выбранном положении (в конечном итоге заменяя текст, если что-то выбрано), а базовая работа по правильному форматированию текста внутри RTF выполняется самим управлением