none
DataGridView RRS feed

  • Frage

  • Hi,

    in einem DataGridView zeige ich in einer Spalte Verzeichnispfade an.

    im Moment werden die Pfade in  dieser Form angezeigt:

    Drive:\Folder\Folder\Folder\...

    Im Tooltip erscheint dann der komplette von mir gespeicherte Pfad.

    Ich möchte jetzt den Pfad anders kürzen (...\Folder\folder) und anzeigen.

    Eine Routine zur Pfadkürzung habe ich bereits, aber wie und wo muss ich jetzt den gekürzten Pfad speichern, damit er wie gewünscht angezeigt wird, ohne das die Information des vollständigen Pfades verloren geht.

    Danke für Tipps

     

    Gruß

     

    Werner

     

     

     

     


    Montag, 25. April 2011 07:48

Antworten

  • Hallo Werner,

    • Wenn ich dann aber e.Value zuweise, ist natürlich mein vollständiger Pfad weg.

    nein, der ist nicht weg, der steht immernoch im Value der Zelle selber, deswegen gibt es ja ein CellFormatting-Ereignis.

     

      void Dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
      {
       if ((e.ColumnIndex == dgv.Columns["DirectoryName"].Index)
        && e.Value != null)
       {
        DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
        e.Value = "neu";
        object wertIstNichtWeg = cell.Value; // ;-)
        cell.ToolTipText = DeineTooltipPfadAnpassung(cell.Value as string); // oder wie gewünscht eben.
        }
      }
    
    

    ciao Frank
    Dienstag, 26. April 2011 06:36

Alle Antworten

  • Hallo Werner,
    ein Beispiel:
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.IO;
    using System.Windows.Forms;
    
    
      // [Gewusst wie: Hinzufügen von QuickInfos zu einzelnen Zellen in einem DataGridView-Steuerelement in Windows Forms]
      // http://msdn.microsoft.com/de-de/library/2249cf0a.aspx
    namespace WinDgvTooltip
    {
     public partial class Form1 : Form
     {
     DataGridView dgv = new DataGridView();
    
     public Form1()
     {
      InitializeComponent();
      this.Load += new EventHandler(Form1_Load);
      Controls.Add(dgv);
      Width = 700; dgv.Dock = DockStyle.Fill;
      dgv.CellFormatting += Dgv_CellFormatting;
     }
    
     void Dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
     {
      if ((e.ColumnIndex == dgv.Columns["DirectoryName"].Index)
      && e.Value != null)
      {
      DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
      cell.ToolTipText = DeineTooltipPfadAnpassung(e.Value as string);
      }
     }
    
     private string DeineTooltipPfadAnpassung(string verzeichnis)
     {
      FileInfo fi = new FileInfo(verzeichnis);
      string subDir = Directory.GetParent(fi.FullName).Name;
      return Path.Combine("...", subDir, fi.Name);
     }
    
     private void Form1_Load(object sender, EventArgs e)
     {
      List<FileInfo> dateien = new List<FileInfo>{ // Demo-Daten
      new FileInfo(typeof(Form).Assembly.Location),
      new FileInfo(typeof(File).Assembly.Location),
      new FileInfo(typeof(Point).Assembly.Location)};
      dgv.DataSource = dateien;
      dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
     }
     }
    }
    
    

    ciao Frank
    Montag, 25. April 2011 15:13
  • Hallo Frank,

    danke für Deinen Beitrag.

    Vielleicht habe ich mich missverständlich ausgedrückt, aber das, was Du mir vorschlägst, ist nicht dass was ich möchte.

    Also versuche ich es noch einmal zu erklären:

    Wert meiner Zelle ist z. B.:

    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    angezeigt wird:

    IST
    In der Zelle:
    als Wert:
    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP
    angezeigt:
    C:\Users\Werner Perpli...
    Als Tooltip:
    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    SOLL
    In der Zelle:
    als Wert:

    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP
    angezeigt
    :
    ...ien\Kunde\VP
    Als Tooltip:
    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    Dein, von mir angepasster Vorschlag:

            private void dgvPublicationList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
               DataGridView dgv = (DataGridView)sender;
               if (e.Value != null && e.ColumnIndex == dgv.Columns["Verzeichnis"].Index)
             
                {
                    DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
                    // cell.ToolTipText = DeineTooltipPfadAnpassung(e.Value as string);
                    cell.ToolTipText = GetShortPath(dgv, e);
                }
            }

    liefert:

    In der Zelle:
    als Wert:

    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP
    angezeigt
    :
    C:\Users\Werner Perpli...
    Als Tooltip:
    ...ien\Kunde\VP

    alles klar?

    Gruß

    Werner

    Montag, 25. April 2011 16:39
  • Hallo Werner, Setzen von dem, was im Zellen-ToolTip angezeigt werden soll so:
        cell.ToolTipText = [DeinToolTip];
    

     

    Setzen von dem, was in der Zelle im DataGridView Grid angezeigt werden soll, zum Beispiel so:
        e.Value = "dein gewünschter Text";
    

     

    in meinem Beispiel etwa:
        cell.ToolTipText = e.Value as string;
       e.Value = DeineTooltipPfadAnpassung(e.Value as string); 
    

    ciao Frank
    Montag, 25. April 2011 19:13
  • Hallo Frank,

    so habe ich das ja auch gesehen, aber schau Dir doch noch mal dies an:

    IST
    In der Zelle:
    als Wert:
    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP
    angezeigt:
    C:\Users\Werner Perpli...
    Als Tooltip:
    C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    das ist doch ganz offensichtlich anders, oder?

    angezeigt:
    C:\Users\Werner Perpli...

    e.value ist aber: C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    Wo wird also C:\Users\Werner Perpli... zugewiesen und gespeichert?

    Gruß

    Werner

    Montag, 25. April 2011 19:51
  • Hallo Werner,

    • angezeigt:  C:\Users\Werner Perpli...
      e.value ist aber: C:\Users\Werner Perplies\Documents\!Venturadateien\Kunde\VP

    Also der Inhalt von Zellen kann natürlich nur soweit dargestellt werden, wie die Zelle breit ist.

    In meinem Beispiel habe ich ja ein:

     

    dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    
    

     

    damit auf jeden Fall die volle Breite dargestellt wird - ggf. mit einer dementsprechend angepassten Breite ds Grids.

    Normal zeichnet das DataGridView die Auslassungszeichen intern über den TextRenderer mit TextFormatFlags.EndEllipsis (Entfernt das Ende von abgeschnittenen Zeilen und ersetzt diese durch ein Auslassungszeichen).

    Also etwa:

     

      private void button1_Click(object sender, EventArgs e)
      {
       TextFormatFlags flags = TextFormatFlags.Bottom | TextFormatFlags.EndEllipsis;
       TextRenderer.DrawText(CreateGraphics(), 
        "Dies ist ein Text der am Ende mit ... abgeschnitten wird.", 
        Font, new Rectangle(10, 10, 100, 50), SystemColors.ControlText, flags);
      }
    

     


    Deinen Quellcode kenne ich ja nicht.
    ciao Frank


    Montag, 25. April 2011 20:09
  • Hallo Frank,

    Also der Inhalt von Zellen kann natürlich nur soweit dargestellt werden, wie die Zelle breit ist.

    In meinem Beispiel habe ich ja ein:

     

    dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

     

    damit auf jeden Fall die volle Breite dargestellt wird - ggf. mit einer dementsprechend angepassten Breite ds Grids.

    Das ist alles klar.

    Die Darstellung soll dem verfügbaren Platz entsprechen, der Inhalt soll erhalten bleiben.

     

    Normal zeichnet das DataGridView die Auslassungszeichen intern über den TextRenderer mit TextFormatFlags.EndEllipsis (Entfernt das Ende von abgeschnittenen Zeilen und ersetzt diese durch ein Auslassungszeichen).

    Ja, und diesen Vorgang würde ich gerne durch mein Verfahren ersetzen.

    Um die richtige Länge meines Strings zu ermitteln verwende ich die Größe und den Font der angezeigten Spalte.

    Wenn ich dann aber e.Value zuweise, ist natürlich mein vollständiger Pfad weg.

    Ich muss wohl für die spätere Verwendung noch einmal den kompletten Pfad in einer separaten Liste verwalten.

    Danke für Deine Beiträge.

    Gruß

    Werner

     

     

    Dienstag, 26. April 2011 06:08
  • Hallo Werner,

    • Wenn ich dann aber e.Value zuweise, ist natürlich mein vollständiger Pfad weg.

    nein, der ist nicht weg, der steht immernoch im Value der Zelle selber, deswegen gibt es ja ein CellFormatting-Ereignis.

     

      void Dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
      {
       if ((e.ColumnIndex == dgv.Columns["DirectoryName"].Index)
        && e.Value != null)
       {
        DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
        e.Value = "neu";
        object wertIstNichtWeg = cell.Value; // ;-)
        cell.ToolTipText = DeineTooltipPfadAnpassung(cell.Value as string); // oder wie gewünscht eben.
        }
      }
    
    

    ciao Frank
    Dienstag, 26. April 2011 06:36
  • Hallo Frank,

    ;-)

    jetzt hat's Klick gemacht.

    In meinem Kopf war irgendwie die Verbindung:

    Cell.Value == e.Value!

    Jetzt ist alles klar!

    Danke

     

    Gruß

    Werner

     

    Dienstag, 26. April 2011 06:55