Ограничьте текстовый редактор DevExpress-WinForms его шириной, а не максимальной длиной - PullRequest
0 голосов
/ 11 января 2012


Мне нужно ограничить текст в 1 строку, введенный в редакторе репозитория XtraGrid, фиксированной шириной его столбца.Я не могу использовать моноширинный шрифт и MaxLenght, потому что это поле будет показано в отчете.
В обработчике событий KeyPress я попытался создать метку, наложить на нее строку и сравнить ее PreferedSize.Width с шириной столбца.Это почти хорошо работало, но нелегко управлять операциями вставки, если мне нужно удалить превышающие символы (например, если я изменяю текстовое значение, курсор переходит на 0).
Я также пытался использовать ActiveEditor.CreateGraphics.MeasureString, но не может заставить его рисовать (измерять) текст так же, как это делает DevExpress.
Если бы я мог перехватить событие Before_WordWrap, это было бы решением.
Спасибо.

Отредактировано: Iвидите, у меня есть 2 отрицательных голоса, потому что кто-то считает, что у меня не было достаточно усилий, чтобы найти ответ самостоятельно, но я считаю, что ответ был нелегким!Я не буду удалять ветку, потому что думаю, что это может быть полезно для других.С уважением.

1 Ответ

0 голосов
/ 12 января 2012

Благодаря предложению DJ KRAZE я получил его.
В событии EditValueChanging репозитория TextEdit я назначаю e.NewValue метке DevExpress и сравниваю ее PreferredSize.Widht со столбцом Width. Если оно больше, я удаляю символы до тех пор, пока оно не станет меньше, и присваиваю текст e.NewValue.
Курсор прыгал до 0, поэтому (согласно FAQ по DevExpress) мне пришлось сделать Invoke, чтобы изменить свойство TextEdit.SelectionStart. Черт! VB-2008 не принимает анонимные методы и должен был поставить appart:)
Спасибо.
Привет.

Private Sub RepositoryItemTextEditDescrip_EditValueChanging(ByVal sender As Object, ByVal e As DevExpress.XtraEditors.Controls.ChangingEventArgs) Handles RepositoryItemTextEditDescrip.EditValueChanging
    Static lbl As New DevExpress.XtraEditors.LabelControl
    Dim tx As DevExpress.XtraEditors.TextEdit = sender
    Dim s As String = e.NewValue.ToString.Split(vbCr)(0)
    lbl.Text = s
    lbl.Font = tx.Font
    If lbl.PreferredSize.Width >= colDescrip.Width - 15 Then
        Do Until lbl.PreferredSize.Width <= colDescrip.Width - 15 Or s.Length = 0
            s = s.Remove(s.Length - 1)
            lbl.Text = s
        Loop
    End If
    Dim i As Integer = tx.SelectionStart
    e.NewValue = s
    BeginInvoke(New Action(Of TextEdit, Integer)(AddressOf sbTxSelectIndx), New Object() {tx, i})
End Sub
Private Sub sbTxSelectIndx(ByVal tx As TextEdit, ByVal i As Integer)
    tx.Select(i, 0)
End Sub
...