IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

AUX EXPERTS : Mettre en surbrillance une partie seulement du texte modifiable d'un listViewItem


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut AUX EXPERTS : Mettre en surbrillance une partie seulement du texte modifiable d'un listViewItem
    Bonjour,

    Je recherche une méthode permettant de mettre en surbrillance une partie du texte contenu dans le l'élément 0 (modifiable) d'un listViewItem. Le résultat que je désirs obtenir est le suivant :
    Durant l'édition d'un élément, normalement, celui-ci par défaut est mis entièrement en surbrillance via l'événement BeforeLabelEdit et AfterLabelEdit:

    Nom : Sans-titre-1.jpg
Affichages : 247
Taille : 4,9 Ko

    Je désire obtenir un résultat équivalent qu'obtient (Winzip) pour ne pas le citer... lorsqu'on renomme un fichier contenu dans un zip :

    Nom : Sans-titre-2.jpg
Affichages : 227
Taille : 5,0 Ko

    Le problème est que je n'arrive pas à trouver un moyen permettant de ne sélectionner que le nom du fichier sans son type. En effet, à l'instar d'un textBox il n'existe pas de méthodes telles que SelStart et SelLength.

    Quelqu'un aurait-il une solution à m'apporter ?

    Merci d'avance !

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Vu que le listview et consorts(listbox,combo etc..) utilise un textbox comme editeur ,il suffit d'injecter 2 controls textbox à la position idoine....un pour le nom et l'autre pour l'extension lors de l'event
    listView1_ItemSelectionChanged...

    Ceci necessite de recuperer
    -le rectangle e.Item.Bounds(portion label)
    -le Split du e.Item.Text
    -la "measure" du string de la chaine Nom pour recupere son size, et definir son rectangle englobant qui sera affecter au textbox1
    -le "reste" du rectangle e.Item.Bounds(portion label) sera affecte au 2eme textbox qui contiendra le separator "point" +extension.
    -mettre textbox2 à readonly
    -gerer lostfocus du textbox1 pour maj de e.Item.Text

    code .cs du form exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinCustomListView2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                    this.listView1.View = View.Details;
                    this.listView1.Font = new Font("Tahoma", 10.0f, FontStyle.Bold);
                    ColumnHeader columnHeader1 = new ColumnHeader();
                    columnHeader1.Text = "Item";
                    columnHeader1. Width = 146;
                    columnHeader1. TextAlign  = HorizontalAlignment.Left;
     
     
                    this.listView1.Columns.Add(columnHeader1);
                    String[] foodList   = new String[] {"Jus de Fruit.txt", "Cafe.txt",
                           "Cereales.txt", "Fromage.txt"};
                    int  count ;
                    for( count = 0  ;count<foodList.Length ;count++)
                    {
                        ListViewItem listItem =new ListViewItem(foodList[count]);
                        this.listView1.Items.Add(listItem);
                    }
                    myBoxNom.MouseEnter += new EventHandler(myBoxNom_MouseEnter);
                    myBoxNom.LostFocus += new EventHandler(myBoxNom_LostFocus);
            }
            private TextBox myBoxNom = new TextBox();
            private TextBox myBoxExt = new TextBox();
            private string[] arrStr ;
            private ListViewItem currentItem = null;
            private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
            {
     
                if (myBoxNom !=null )
                {
                    listView1.Controls.Remove(myBoxNom);
                    listView1.Controls.Remove(myBoxExt);
                }
     
                currentItem = e.Item;
                Rectangle rect = currentItem.GetBounds(ItemBoundsPortion.Label);
                Graphics  gr  = listView1.CreateGraphics();
                char[]  sep  =".".ToCharArray();
     
                arrStr = currentItem.Text.Split(sep);
                String strNom   = arrStr[0];
                String  strExt = sep[0] + arrStr[1];
                SizeF szNom   = gr.MeasureString(strNom, e.Item.Font);
                gr.Dispose();
                Rectangle rectNom = new Rectangle(rect.Left, rect.Top, (int)szNom.Width, (int)szNom.Height);
                Rectangle rectExt = new Rectangle(rectNom.Right, rectNom.Top, rect.Width - (int)szNom.Width, rect.Height - (int)szNom.Height);
     
                currentItem.Focused = false;
                myBoxNom.ForeColor =currentItem.ForeColor  ;
                myBoxNom.Size = new Size(rectNom.Width, rectNom.Height);
                myBoxNom.Location = rectNom.Location;
                myBoxNom.Text = strNom;
                this.listView1.Controls.Add(myBoxNom);
     
                myBoxExt.ForeColor = currentItem.ForeColor;
                myBoxExt.Size = new Size(rectExt.Width, rectExt.Height);
                myBoxExt.Location = rectExt.Location;
                myBoxExt.Text = strExt;
                myBoxExt.ReadOnly = true;
                this.listView1.Controls.Add(myBoxExt);
                myBoxNom.Focus();
            }
     
            void myBoxNom_LostFocus(object sender, EventArgs e)
            {
                currentItem.Text = myBoxNom.Text + myBoxExt.Text;
            }
     
            void myBoxNom_MouseEnter(object sender, EventArgs e)
            {
                myBoxNom.ForeColor = Color.Blue ;
            }
     
        }
    }
    en esperant que cela fera ton bonheur.....
    bon code....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 110
    Points : 44
    Points
    44
    Par défaut
    Un grand merci à toi pour cette réponse précieuse !
    Je vais étudier tout cela à tête reposée et je te tiens au courant.

    Je ne ferme pas encore le sujet au cas ou je rencontrerai des problèmes...

    Cordialement

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/07/2015, 22h46
  2. [AC-2003] Mettre en gras une partie d'un texte
    Par STOUPI dans le forum Access
    Réponses: 1
    Dernier message: 15/03/2011, 13h58
  3. Mettre en cache une partie seulement de la requête
    Par Feng-Huang dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/05/2009, 23h30
  4. Réponses: 14
    Dernier message: 26/03/2007, 16h52
  5. [Excel]Mettre en gras une partie d'un label
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/03/2006, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo