ListView

Résolu
Signaler
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
-
Bonsoir,

J'ai un listView qui possède plusieurs colonne qui, pour certaine raisons que je ne vais pas expliquer, ne peuvent pas être resizer.

Dans de rare cas, certaines colonnes ne sont pas suffisamment larges pour displayer tout ce qu'il faudrait, et comme les columns ne devraient pas être resizées, j'aimerais afficher un tooltip qui affiche le tout le text de 'la cellule'.

Question : Comment faire pour savoir si un champ à été tronqué par le listView ou pas?

Merci d'avance !

3 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
la nuit porte conseil : en fait ce code ne fonctionne pas aussi bien que ça -_-
deja j'avais oublier de preciser qu'il faut du fullrowselect (sinon le GetItemAt retourne null pour les subitems)
en plus cette "bidouille" ne fonctionne pas correctement si la police est en gras

sinon il y avais deja une petite erreur : je prend la police de l'item et non du subitem
donc 1ere correction :
private void listView_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
// item "survolé"
ListViewItem item = listView.GetItemAt(e.X, e.Y);

// pas d'item "survolé"
if ( item == null )
{
textBox.Text = string.Empty;
return;
}

// détermination du subitem concerné
ListViewItem.ListViewSubItem subitem = null;
int subitemColumnWidth = 0;
int columnbegin = 0;
foreach ( ColumnHeader column in item.ListView.Columns )
{
if ( columnbegin < e.X && (columnbegin + column.Width) > e.X )
{
subitem = item.SubItems[column.Index];
subitemColumnWidth = column.Width;
break;
}
columnbegin += column.Width;
}

if ( subitem == null )
{
textBox.Text = string.Empty;
return;
}

// détermination de la longueur de dessin de la chaine complete
Graphics g = listView.CreateGraphics();

SizeF size = g.MeasureString(subitem.Text, subitem.Font);

// affichage du texte dans le TextBox si la colonne n'est pas assez large
if ( size.Width > subitemColumnWidth )
textBox.Text = subitem.Text;
else
textBox.Text = string.Empty;
}


pour le reste j'y reflechis lol

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
une petite "bidouille", certe pas parfaite mais ça peut constituer un bon debut je pense :)
bon, j'ai mit dans un TextBox, à toi de voir pour le tooltip ^^
private void listView_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
// item "survolé"
ListViewItem item = listView.GetItemAt(e.X, e.Y);

// pas d'item "survolé"
if ( item == null )
{
textBox.Text = string.Empty;
return;
}

// détermination du subitem concerné
string subitemText = null;
int subitemWidth = 0;
int columnbegin = 0;
foreach ( ColumnHeader column in item.ListView.Columns )
{
if ( columnbegin < e.X && (columnbegin + column.Width) > e.X )
{
subitemText = item.SubItems[column.Index].Text;
subitemWidth = column.Width;
break;
}
columnbegin += column.Width;
}

if ( subitemText == null )
{
textBox.Text = string.Empty;
return;
}

// détermination de la longueur de dessin de la chaine complete
Graphics g = listView.CreateGraphics();
SizeF size = g.MeasureString(subitemText, item.Font);

// affichage du texte dans le TextBox si la colonne n'est pas assez large
if ( size.Width > subitemWidth )
textBox.Text = subitemText;
else
textBox.Text = string.Empty;
}


tu remarqueras que quand la colonne est "juste assez large" (+ qq pixels aussi), elle est quand même détectée comme etant trop etroite
ce n'est pas tres grave en soit, le principal etant qu'un texte tronqué est bien détecté :)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Merci Coq, c'est exactement ce que je cherchais ;-)
Bon, si le text est tout juste tronqué, mon tooltip ne s'affiche pas... mais c'est pas si grave.

Encore merci.