Я столкнулся с той же проблемой, пытаясь выровнять данные в MessageBox
, и после поиска некоторое время я решил написать свой собственный метод, используя TextRenderer.MeasureText
, чтобы получить измерения на уровне пикселей.Метод принимает два параметра;первая - строка для форматирования, а вторая - самая длинная строка, которая будет показана слева от двоеточия (символ выравнивания в этом примере).Метод выполняет добавление пробелов до тех пор, пока строка не достигнет, но не превысит длину самой длинной строки.Метод вызывается, как показано ниже, где «Department:» - самая длинная строка.
StringBuilder sb = new StringBuilder();
string longest = "Department: ";
sb.AppendLine(StringLengthFormat("Result(s): ", longest) + results);
Фактический метод, который выполняет форматирование:
private string StringLengthFormat(string inString, string longest)
{
Size textSizeMax = TextRenderer.MeasureText(longest, System.Drawing.SystemFonts.DefaultFont);
Size textSizeCurrent = TextRenderer.MeasureText(inString, System.Drawing.SystemFonts.DefaultFont);
do
{
inString = " " + inString;
textSizeCurrent = TextRenderer.MeasureText(inString, System.Drawing.SystemFonts.DefaultFont);
} while (textSizeCurrent.Width < textSizeMax.Width);
return inString;
}
, потому что я также могу иметь одинили больше строк, которые НЕ начинаются с «описания», за которым следует двоеточие, но все еще должны быть выровнены. Я нашел способ форматировать эти строки, используя тот же метод.Я объединяю эти данные, используя символы возврата каретки и табуляции "\r\t"
, а затем заменяю символ табуляции "\t"
моим методом. Обратите внимание , что я включаю два пробела, которые следуют за двоеточием в этом примере, чтобы дать методу форматирования что-то, к чему нужно добавить, и что я обрезаю завершающий "\r\t"
перед форматированием строки.Полный раздел кода показан ниже, за которым следует ссылка на пример вывода MessageBox
, созданного этим кодом.
string results = "";
StringBuilder sb = new StringBuilder();
string longest = "Department: ";
foreach (EncounterInfo enc in lei)
{
results += enc.Description + " " + enc.ResultValue + " " + enc.ResultUnits + "\r\t";
}
results = results.TrimEnd(new char[] { '\r', '\t' });
results = results.Replace("\t", StringLengthFormat(" ", longest));
sb.AppendLine(StringLengthFormat("Result(s): ", longest) + results);
sb.AppendLine(StringLengthFormat("Patient: ", longest) + ei.PatientName);
sb.AppendLine(StringLengthFormat("Accession: ", longest) + ei.AccessionNumber);
sb.AppendLine(longest + ei.CollectionClassDept);
sb.AppendLine();
sb.AppendLine("Continue?");
dr = MessageBox.Show(sb.ToString(), "Add to Encounters", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
Пример MessageBox с форматированием длины строки