Я ищу лучший способ сортировки строк RichTextBox, сейчас я использую это:
public void SortLines(object sender, EventArgs e)
{
TextPointer pStart = TextInput.Document.ContentStart;
TextPointer pEnd = TextInput.Document.ContentEnd;
TextRange text = new TextRange(pStart, pEnd);
string[] lines = text.Text.Split('\n');
Array.Sort(lines);
text.Text = String.Join(String.Empty, lines);
}
Есть ли лучший способ сделать это?
Когда я его вызываю, курсор помещается в первую строку RichTextBox, как мне поместить его туда, где он был раньше? Я пытался установить pStart/pEnd и CaretPositiom, но свойства доступны только для чтения.
Я надеюсь, что это ясно. Заранее спасибо.
Ответ 1 · рейтинг 1 · Eric Paroissien
Неэлегантное, но практичное решение; назад и вперед richtextbox в ListBox: в свойствах вашего listBox вы нажимаете "отсортировано"> true
[c#]
ListBox1.Items.AddRange(RichTextBox1.Lines);
for (int x = 0; (x
<= (ListBox1.Items.Count - 1)); x++) {
RichTextBox1.AppendText((ListBox1.Items(x).ToString.Environment.NewLine));
}
[ВБ.NET]
ListBox1.Items.AddRange(RichTextBox1.Lines)
For x As Integer = 0 To ListBox1.Items.Count - 1
RichTextBox1.AppendText(ListBox1.Items(x).ToString & Environment.NewLine)
Next
Ответ 2 · Avi Turner
Что касается сортировки, это решение не отличается от предложенного вами, но я нахожу его более элегантным + оно обрабатывает местоположение и выбор курсора:
public void SortLines(object sender, EventArgs e)
{
rtb.HideSelection = false; //for showing selection
/*Saving current selection*/
string selectedText = rtb.SelectedText;
/*Saving curr line*/
int firstCharInLineIndex = rtb.GetFirstCharIndexOfCurrentLine();
int currLineIndex = rtb.Text.Substring(0, firstCharInLineIndex).Count(c => c == '\n');
string currLine = rtb.Lines[currLineIndex];
int offset = rtb.SelectionStart -firstCharInLineIndex;
/*Sorting*/
string[] lines = rtb.Lines;
Array.Sort(lines, delegate(string str1, string str2) { return str1.CompareTo(str2); });
rtb.Lines = lines;
if (!String.IsNullOrEmpty((selectedText)))
{
/*restoring selection*/
int newIndex = rtb.Text.IndexOf(selectedText);
rtb.Select(newIndex, selectedText.Length);
}
else
{ /*Restoring the cursor*/
//location of the current line
int lineIdx = Array.IndexOf(rtb.Lines, currLine);
int textIndex = rtb.Text.IndexOf(currLine);
int fullIndex = textIndex + offset;
rtb.SelectionStart = fullIndex;
rtb.SelectionLength = 0;
}
}
Ответ 3 · TheJonz
Спасибо, Эрик Паруасьен, за простое решение! В коде C# было несколько проблем - вот его решение с исправлением
ListBox1.Items.Clear();
ListBox1.Items.AddRange(RichTextBox1.Lines);
RichTextBox1.Clear();
for (int x = 0; (x <= (ListBox1.Items.Count - 1)); x++)
{
RichTextBox1.AppendText(ListBox1.Items[x].ToString());
RichTextBox1.AppendText(Environment.NewLine);
}
Ответ 4 · YaoChen Aan
RichTextBox работает как массив, мы можем использовать array.sort следующим образом:
Dim MyArray() As String
MyArray = RichTextBox1.Lines
Array.Sort(MyArray)
RichTextBox1.Clear()
For Each item In MyArray
RichTextBox1.Text &= item & Environment.NewLine
Next