Я сделал это для небольшого проекта некоторое время назад, и вот упрощенное решение, которое я нашел.
Создайте новый элемент управления путем подкласса RichTextBox:
public class SynchronizedScrollRichTextBox : System.Windows.Forms.RichTextBox
{
public event vScrollEventHandler vScroll;
public delegate void vScrollEventHandler(System.Windows.Forms.Message message);
public const int WM_VSCROLL = 0x115;
protected override void WndProc(ref System.Windows.Forms.Message msg) {
if (msg.Msg == WM_VSCROLL) {
if (vScroll != null) {
vScroll(msg);
}
}
base.WndProc(ref msg);
}
public void PubWndProc(ref System.Windows.Forms.Message msg) {
base.WndProc(ref msg);
}
}
Добавьте новый элемент управления в свою форму и для каждого элемента управления явным образом уведомите другие экземпляры элемента управления о том, что его позиция vScroll изменилась , Что-то вроде этого:
private void scrollSyncTxtBox1_vScroll(Message msg) {
msg.HWnd = scrollSyncTxtBox2.Handle;
scrollSyncTxtBox2.PubWndProc(ref msg);
}
Я думаю, что этот код имеет проблемы, если все «связанные» элементы управления не имеют одинакового количества отображаемых строк.