-3


我需要将在 XtraGrid 存储库编辑器中输入的 1 行文本限制为其列固定宽度。我不能使用等宽字体和 MaxLenght,因为该字段将显示在报告中。
在 KeyPress 事件处理程序中,我尝试创建一个标签,将字符串放在其上并将其 PreferedSize.Width 与列的宽度进行比较。它几乎工作得很好,但如果我必须删除超出的字符,则不容易控制粘贴操作(例如:如果我更改文本值,光标会跳转到 0)。
我也尝试使用 ActiveEditor.CreateGraphics.MeasureString 但无法像 DevExpress 那样绘制(测量)文本。
如果我能捕捉到 Before_WordWrap 事件,那将是一个解决方案。
谢谢你。

编辑:我明白了,我有2票反对,因为有人认为我没有足够的努力自己找到答案,但我认为答案并不容易!我不会删除线程,因为我认为它可能对其他人有用。问候。

4

1 回答 1

0

感谢 DJ KRAZE 的建议,我明白了。
在存储库 TextEdit 的 EditValueChanging 事件中,我将 e.NewValue 分配给 DevExpress 标签并将其 PreferredSize.Widht 与列 Width 进行比较。如果它更大,我会删除字符,直到它更小并将文本分配给 e.NewValue。
光标跳到 0,所以(根据 DevExpress 常见问题解答)我必须执行调用来更改 TextEdit.SelectionStart 属性。该死!VB-2008 不接受匿名方法,必须把它分开 :)
谢谢。
问候。

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
于 2012-01-12T11:21:18.203 回答