2008-08-21 16 views
6

.NETのパス文字列を自動的にトリミングする方法はありますか?例えばラベルのパス表示

C:\Documents and Settings\nick\My Documents\Tests\demo data\demo data.emx 

は、これはLabelクラスに組み込まれた場合には、特にクールになる

C:\Documents...\demo data.emx 

になり、私はそれを思い出すように見えるである - それを見つけるcan'tしかし!

答えて

9

使用TextRenderer.DrawTextフラグTextFormatFlags.PathEllipsis

void label_Paint(object sender, PaintEventArgs e) 
{ 
    Label label = (Label)sender; 
    TextRenderer.DrawText(e.Graphics, label.Text, label.Font, label.ClientRectangle, label.ForeColor, TextFormatFlags.PathEllipsis); 
} 

あなたのコードでは、95%でした。唯一の 問題は、トリミングされたテキストが というラベルのテキストの上に既に描画された であることです。

ありがとう、私はそれを知っていました。私の意図は、DrawTextメソッドの使用を実証することだけでした。ラベルごとにイベントを手動で作成するか、継承ラベルのOnPaint()メソッドをオーバーライドするかはわかりませんでした。あなたの最終的な解決策を共有してくれてありがとう。

0

何がラベルに考えていることは、それが幅よりも長い場合(自動サイズに設定されていない)...それは置くということですが、サポートがあればそれは

c:\Documents and Settings\nick\My Doc... 

だろうSystem.IOのPathクラスにある可能性があります。

0

System.IO.Path.GetFileNameメソッドを使用し、その文字列を短縮されたSystem.IO.Path.GetDirectoryName文字列に追加できます。

3

いないが、自分で作成するのは難しい:

public static string TrimPath(string path) 
    { 
     int someArbitaryNumber = 10; 
     string directory = Path.GetDirectoryName(path); 
     string fileName = Path.GetFileName(path); 
     if (directory.Length > someArbitaryNumber) 
     { 
      return String.Format(@"{0}...\{1}", 
       directory.Substring(0, someArbitaryNumber), fileName); 
     } 
     else 
     { 
      return path; 
     } 
    } 

私はあなたにも拡張メソッドとして追加ことができると思います。

3

@lubos haskoコードは95%です。唯一の問題は、トリムされたテキストが既にラベルにあるテキストの上に描画されることです。これは簡単に解決されます:

Label label = (Label)sender; 
    using (SolidBrush b = new SolidBrush(label.BackColor)) 
     e.Graphics.FillRectangle(b, label.ClientRectangle); 
    TextRenderer.DrawText(
     e.Graphics, 
     label.Text, 
     label.Font, 
     label.ClientRectangle, 
     label.ForeColor, 
     TextFormatFlags.PathEllipsis); 
関連する問題