-3


XtraGrid リポジトリ エディターに入力された 1 行のテキストを列の固定幅に制限する必要があります。このフィールドはレポートに表示されるため、等幅フォントと MaxLenght は使用できません。
KeyPress イベント ハンドラーで、Label を作成して文字列を配置し、その PreferedSize.Width を列の Width と比較しようとしました。ほとんどうまくいきましたが、超過した文字を削除する必要がある場合、貼り付け操作を制御するのは簡単ではありません (例: テキスト値を変更すると、カーソルが 0 にジャンプします)。
ActiveEditor.CreateGraphics.MeasureString も使用してみましたが、DevExpress と同じようにテキストを描画 (測定) することはできません。
Before_WordWrap イベントをキャッチできれば、それが解決策になります。
ありがとうございました。

編集: なるほど、自分で答えを見つけるのに十分な努力がなかったと誰かが考えているので、2 票の反対票がありますが、答えは簡単ではなかったと思います! スレッドは他の人の役に立つと思うので削除しません。よろしく。

4

1 に答える 1

0

DJ KRAZEさんの提案のおかげで手に入れました。
リポジトリ TextEdit の EditValueChanging イベントで、e.NewValue を DevExpress ラベルに割り当て、その PreferredSize.Widht を列幅と比較します。大きい場合は、小さくなるまで文字を削除し、テキストを e.NewValue に割り当てます。
カーソルが 0 にジャンプしていたため、(DevExpress FAQ によると) Invoke を実行して 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 に答える