2012-01-11 2 views
-2


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

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

+1

Вы уверены, что не можете использовать свойство maxlength ..? что такое поле в XTraGrid, которое вы хотите ограничить .. также есть EventHandler, где вы можете получить длину текста и установить максимальную длину .. ???? – MethodMan

+0

Поле - это описание статьи счета, которое будет отображаться в отчете Crystal Reports. Я не могу использовать многострочные поля. –

+1

Какова максимальная длина, в которой вы хотите ввести текст, который был введен ... можете ли вы опубликовать код, в котором вы собираетесь использовать эту функцию, и я могу опубликовать то, что я переписываю, чтобы узнать, будет ли оно работать для вас. .? внутри сетки, где она заполняется, должно быть событие onChanged для этого поля в отношении текста .. это то, где вы действительно должны сделать проверку. многострочный не проблема .. это больше длины строки там есть несколько способов справиться с этим, но действительно нужно будет увидеть фрагмент кода, который вы работаете с – MethodMan

ответ

0

Благодаря предложению DJ KRAZE я получил его.
В событии EditValueChanging репозитория TextEdit я присваиваю e.NewValue ярлыку DevExpress и сравниваю его PreferredSize.Widht с шириной столбца. Если он больше, я удаляю символы до тех пор, пока он не станет меньше, и присвойте текст 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 
+1

Голосование всегда приветствуется. Я рад, что смог дать вам подсказку. Я тоже знаю VB, но предпочитаю держаться подальше от него. LOL еще раз .. glad Я мог бы помочь вам указать в правильном направлении ... – MethodMan

+0

Еще раз спасибо. Мне нравится VB, я всегда возился с этими {} всюду на C#. –

+1

голосуйте, если вы можете – MethodMan