Я пытаюсь добавить строку пользовательского ввода в StringBuilder, которую затем могу использовать в другом месте для отображения строки, которую я создаю. Проблема в том, что когда пользователь выполняет возврат каретки, и я пытаюсь добавить это в StringBuilder, он удаляет escape-символы и, следовательно, возврат.
Например, скажем, пользователь вводит следующее:
Hello, My name is Tom.
Когда я вытаскиваю эту строку из элемента управления текстовым полем и передаю ее моему методу, который содержит StringBuilder, это выглядит так:
Hello,\r\nMy name is Tom.
Но как только я добавляю его в StringBuilder, он удаляет все escape-символы и становится таким:
Hello,My name is Tom.
Это приводит к тому, что вывод будет:
Hello,My name is Tom
вместо:
Hello, My name is Tom
Это метод, который извлекает пользовательский ввод из Ctrl
protected List<BetweenTagData> BetweenTagDataPull(string ctrlName)
{
List<BetweenTagData> data = new List<BetweenTagData>();
BetweenTagData pullIt = new BetweenTagData();
if (ctrlName == "Label")
{
pullIt.text = TagLabelTxtbxEnterText.Text.ToString();
data.Add(pullIt);
}
return data;
}
Это метод, который строит строку с помощью StringBuilder.
static public string TagBetween(List<BetweenTagData> betweenData)
{
StringBuilder betweenString = new StringBuilder();
foreach (BetweenTagData row in betweenData.ToList())
{
if (row.text != "")
{
betweenString.Append(row.text);
}
}
return betweenString.ToString();
}
@Jasen Если вы будете следовать коду строка за строкой, используя точку останова, это покажет, что row.fontSize имеет правильную строку. как только он добавляется к построителю строк, строка изменяется, а escape-символы удаляются.
Я запустил отладчик на .Append()
, и в моем простом тесте он сохраняет "\r\n" после .ToString()
.
@Jasen Клянусь, моя голова иногда наполняется воздухом. Я разместил неправильные методы. вздох. Я обновил свой пост. Прости. В настоящее время я отлаживаю указанный код, и поэтому мои мозги дислектичны.
Почему вы звоните ToList()
, когда вы уже есть список, и ToString()
, когда вы уже есть строка?
@JoelCoehoorn The ToList() был попыткой увидеть, не сошел ли компилятор с ума (мой профессор колледжа назвал это FM F ***ing Magic). Что касается ToString(), это необходимо, так как мой метод возвращает строку, а не StringBuilder. Если вы напишите код в VS, вы увидите красные линии и именно это и говорит.
Не тот ToString()
. Этот: TagLabelTxtbxEnterText.Text.ToString()
@JoelCoehoorn был сделан по той же причине. Во всяком случае, я исправил это. Прокомментировал ниже.
Я не уверен, в чем именно заключается ваша проблема, но я могу с уверенностью сказать, что типы StringBuilder
не заботятся об этих символах и не изменяют их. Настоящая проблема скорее в классе BetweenTagData
. Я также могу помочь вам улучшить существующие методы:
protected List<BetweenTagData> BetweenTagDataPull(string ctrlName)
{
List<BetweenTagData> data = new List<BetweenTagData>();
if (ctrlName == "Label")
{
data.Add(new BetweenTagData() {text = TagLabelTxtbxEnterText.Text});
}
return data;
}
static public string TagBetween(IEnumerable<BetweenTagData> betweenData)
{
return string.Join("", betweenData.Where(bd => !string.IsNullOrEmpty(bd.text)).Select(bd => bd.text));
}
Мой класс BetweenTagData буквально просто имеет публичный текст строки {get; набор; } прямо сейчас. Мне нужно, чтобы этот шаг работал, прежде чем я начну над ним работать.
Вы правы, что проблема была где-то еще в коде, но не в классе. В отладчике он показал строку без escape-символов, когда-то добавленную к StringBuilder, до сих пор не знаю почему, поэтому я подумал, что проблема в этом. На самом деле это была неуместная строка кода в цикле другого метода, который манипулирует той же строкой. Спасибо, что натолкнули меня на мысль поискать в другом месте. Просто казалось, что проблема в этом, потому что снова в отладчике отображалась строка без escape-символов.
Проблема не в StringBuilder. В какой момент кода вы определили, что CRLF был удален?