2008-08-21 16 views
6

Existe-t-il des méthodes automatiques pour rogner une chaîne de chemin dans .NET?Affichage du chemin dans l'étiquette

Par exemple:

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

devient

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

Il serait particulièrement cool si cela a été construit dans la classe d'étiquettes, et je me souviens qu'il est - ne peux pas le trouver bien que!

Répondre

9

Utilisez TextRenderer.DrawText avec TextFormatFlags.PathEllipsis drapeau

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); 
} 

Votre code est de 95% là. Le seul problème est que le texte coupé est dessiné au-dessus du texte qui est déjà sur l'étiquette.

Oui merci, j'en étais conscient. Mon intention était seulement de démontrer l'utilisation de la méthode DrawText. Je ne savais pas si vous vouliez créer manuellement un événement pour chaque étiquette ou simplement remplacer la méthode OnPaint() dans l'étiquette héritée. Merci d'avoir partagé votre solution finale.

0

Qu'est-ce que vous pensez sur l'étiquette est qu'il a mis ... si elle est plus longue que la largeur (non définie à la taille de l'automobile), mais ce serait

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

Si le soutien, il serait probablement dans la classe Path dans System.IO

0

Vous pouvez utiliser la méthode System.IO.Path.GetFileName et ajouter cette chaîne à une chaîne System.IO.Path.GetDirectoryName raccourcie.

3

Pas difficile de vous écrire si:

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; 
     } 
    } 

Je suppose que vous pouvez même l'ajouter comme une méthode d'extension.

3

@lubos hasko Votre code est 95% là. Le seul problème est que le texte coupé est dessiné au-dessus du texte qui est déjà sur l'étiquette. Ceci est facilement résolu:

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);