如何在启用换行的 MemoEdit 控件中获取行数?

How to get number of lines in a MemoEdit control that has wrapping enabled?

我有一个启用了换行功能的 MemoEdit 控件。 MemoEdit 的工作方式是用户看到的换行符只是装饰性的,所以如果用户没有自己按下 'Enter' 键,行 属性 将 return 1 (输入了 1 行)。

我的目标是检索用户看到的行数(带换行) 如果可能的话,还会获取插入修饰换行符的位置,这样我就可以创建一个字符串列表来保存用户看到的行。

1- 您可以通过以下方式获取行数:

声明:SendMessageEM_LINEFROMCHAR

[System.Runtime.InteropServices.DllImport("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

public const int EM_LINEFROMCHAR = 0xC9;

并获取行数:

FieldInfo fi = typeof(DevExpress.XtraEditors.TextEdit).GetField("_maskBox", BindingFlags.Instance | BindingFlags.NonPublic);
DevExpress.XtraEditors.TextBoxMaskBox textBox = (DevExpress.XtraEditors.TextBoxMaskBox)fi.GetValue(memoEdit1);
int linecount = SendMessage(textBox.Handle, EM_LINEFROMCHAR, textBox.MaskBoxText.Length-1, 0)+1;

2- 您可以创建包含 MemoEdit 行的字符串列表,如下所示:

FieldInfo fi = typeof(DevExpress.XtraEditors.TextEdit).GetField("_maskBox", BindingFlags.Instance | BindingFlags.NonPublic);
DevExpress.XtraEditors.TextBoxMaskBox textBox = (DevExpress.XtraEditors.TextBoxMaskBox)fi.GetValue(memoEdit1);
var lines = new List<string>();
for (int line = 0; ; line++)
{
    var start = textBox.GetFirstCharIndexFromLine(line);
    if (start < 0) break;
    var end = textBox.GetFirstCharIndexFromLine(line + 1);
    if (end == -1 || start == end) end = textBox.MaskBoxText.Length;
    lines.Add(textBox.MaskBoxText.Substring(start, end - start));
}