Разрыв строки в текстовом поле - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть текстовое поле, которое следует использовать для отправки отформатированного текста в удаленное приложение, и я должен отформатировать его так, чтобы оно разбивалось на ближайший пробел до 30-го символа (включая пробелы), а пробел, на котором строка разбита, следует удалить это не перенесено в следующий ряд. И, конечно же, он должен делать это до конца текста (разбить, снова начать считать, разбить и так далее). Другое дело, что символы для форматирования текста должны быть исключены из подсчета. У меня есть решение, найденное здесь на SO, но оно работает для одной строки.

string sTemp = textBox1.Text.Substring(0, 30);
sTemp = sTemp.Replace(" @A ", "");
sTemp = sTemp.Replace("@A ", "");
sTemp = sTemp.Replace(" @A", "");
sTemp = sTemp.Replace("@A", "");

sTemp = sTemp.Replace(" @B ", "");
sTemp = sTemp.Replace("@B ", "");
sTemp = sTemp.Replace(" @B", "");
sTemp = sTemp.Replace("@B", "");

int numberOfLeak = 30 - sTemp.Length;
var x = 30 + numberOfLeak;
if (textBox1.Text.Length > x)
{
    textBox1.Text = textBox1.Text.Insert(x, Environment.NewLine);
} 

Может ли кто-нибудь помочь сделать эту работу для многих строк, до конца текста?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

<input type="text" /> (который является разметкой по умолчанию, сгенерированной для asp:textbox) должен иметь только одну строку текста.Вместо этого следует использовать текстовое поле, установив для свойства TextMode значение Многострочный :

<asp:TextBox TextMode="MultiLine" runat="server" ID="mytextarea"></asp:TextBox>

Редактировать:

Я пришел с этим простым кусочком кода.Он заменяет ближайший пробел на позицию range (поэтому после или до этой точки):

int range = 10;
string txt = "helloooooo mister how do you do";

for (int i = range; i < txt.Length - 1; i = i + range + 2)
{
    int closestPosition = txt.IndexOf(" ", i) > txt.LastIndexOf(" ", i)
                              ? txt.IndexOf(" ", i)
                              : txt.LastIndexOf(" ", i);

    txt = txt.Remove(closestPosition, 1).Insert(closestPosition, Environment.NewLine);
}

Возвращает мне следующий фрагмент строки:

"helloooooo\r\nmister how\r\ndo you do"
0 голосов
/ 24 ноября 2011

Если это решение работает для одной строки, просто поместите его в метод и вызовите его в цикле для каждой строки. например,

    // put the lines in an array
    string[] result = textBox1.Text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);

    StringBuilder output = new StringBuilder();

    foreach (string line in result)
    {
        output.AppendLine(WorkingSolutionForOneLine(line));
    }

    string finalResult = output.ToString();

с методом WorkingSolutionForOneLine, который вы указали в своем вопросе:

string WorkingSolutionForOneLine(string line)
{
    string sTemp = line.Substring(0, 30);
    sTemp = sTemp.Replace(" @A ", "");
    sTemp = sTemp.Replace("@A ", "");
    sTemp = sTemp.Replace(" @A", "");
    sTemp = sTemp.Replace("@A", "");

    sTemp = sTemp.Replace(" @B ", "");
    sTemp = sTemp.Replace("@B ", "");
    sTemp = sTemp.Replace(" @B", "");
    sTemp = sTemp.Replace("@B", "");

    int numberOfLeak = 30 - sTemp.Length;
    var x = 30 + numberOfLeak;
    if (line.Length > x)
    {
        line = line.Insert(x, Environment.NewLine);
    }
    return line;
}
...