Si un item est sélectionné dans une listbox [Résolu]

thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 15:42 - Dernière réponse : Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention
- 18 août 2011 à 21:35
bonjour,

je travaille actuellement sur un projet Application Windows Forms, qui à pour but de permettre de visualiser le texte que l'on a écrit dans une textbox sous la police que l'on a sélectionné dans une listbox. Le projet permet aussi d'ajouter/supprimer une police.

je code actuellement le bouton de suppression. j'essaye d'appliquer une condition, à savoir avant de supprimer un élément de la listbox, il faut vérifier qu'un élément a bien été sélectionné.

j'ai donc fais :
if (listbox.SelectedItem)
{
...
}

mais j'ai une erreur : Impossible de convertir implicitement le type 'object' en 'bool'. Une conversion explicite existe (un cast est-il manquant ?)

et je n'arrive pas à la résoudre..

toute aide est la bienvenue :)

amicalement,
Afficher la suite 

Votre réponse

23 réponses

Meilleure réponse
BunoCS 14176 Messages postés lundi 11 juillet 2005Date d'inscription 19 octobre 2018 Dernière intervention - 17 août 2011 à 15:54
3
Merci
Hello,
listbox.SelectedItem te retourne un objet, et non un booléen.
Pour l'utiliser dans une condition if, il faut rajouter une comparaison.


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

Merci BunoCS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de BunoCS
Meilleure réponse
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 16:42
3
Merci
Bonjour

tu peux aussi rendre ton bouton invisible (ou !enabled au choix) au démarrage.
Dans l'évenement click (ou selecteditemchanged si tu peux selectionner depuis le code) de ta listbox tu le rend visible.
Quand tu effaces une police, te le rends à nouveau invisible.
Ainsi l'utilisateur n'a accès au bouton que si il a sélectionné une police.

Whismeril

Merci Whismeril 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Whismeril
Meilleure réponse
BunoCS 14176 Messages postés lundi 11 juillet 2005Date d'inscription 19 octobre 2018 Dernière intervention - 17 août 2011 à 17:48
3
Merci
Pas besoin de recherche: tu connais l'élement sélectionné, donc également son index dans la liste. Tu n'as qu'à aller chercher la font à cet index dans le tableau fontfamill


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

Merci BunoCS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de BunoCS
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 16:16
0
Merci
Merci Buno !

Voilà le code du bouton :

private void btSupprimer_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
lsbPolice.Items.Remove(lsbPolice.SelectedItem);
}
else
{
MessageBox.Show("Veuillez sélectionner une police à supprimer dans la liste !");
}
}

ça fonctionne, mais est-ce correct ? je trouve la solution trop simple, ou alors je vois du compliqué partout.. ^^'
Commenter la réponse de thibaultlavoisey
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 17:13
0
Merci
Re,

je cherche maintenant à faire un autre bouton, pour changer la police d'écriture du texte d'un label avec la police sélectionnée dans ma liste.

Le bouton s'appelle 'afficher'.

Voilà ce que j'ai fais :

private void btAffiche_Click(object sender, EventArgs e)
{
if (lsbPolice.SelectedItem != null)
{
lblVisu.Font = lsbPolice.SelectedItem;
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}

comment plus haut, j'ai une erreur de conversion de type : Impossible de convertir implicitement le type 'object' en 'System.Drawing.Font'. Une conversion explicite existe (un cast est-il manquant ?)

mais là, je vois pas trop comment la résoudre.. un cast Font fais planter mon programme :(
Commenter la réponse de thibaultlavoisey
BunoCS 14176 Messages postés lundi 11 juillet 2005Date d'inscription 19 octobre 2018 Dernière intervention - 17 août 2011 à 17:17
0
Merci
Quel est le type de tes éléments que tu stocke dans la listbox?
Si ce sont des strings, il va te falloir charger la font associée..


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 17:19
0
Merci
Je pense que c'est un type Font..

Voici le code que j'utilise pour charger ma listbox au démarrage du formulaire :

System.Drawing.Text.InstalledFontCollection fonts = new
System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontfamill = fonts.Families;
for (long i = fontfamill.GetLowerBound(0); i <= fontfamill.GetUpperBound(0); i++)
lsbPolice.Items.Add(fontfamill[i].Name);
fontfamill = null;
fonts = null;
lsbPolice.SelectedIndex = 0;
Commenter la réponse de thibaultlavoisey
BunoCS 14176 Messages postés lundi 11 juillet 2005Date d'inscription 19 octobre 2018 Dernière intervention - 17 août 2011 à 17:26
0
Merci
lsbPolice.Items.Add(fontfamill[i].Name);

Moi, je crois plutôt que tu lui passe une String...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 17:30
0
Merci
Xxxx.Name est souvent(toujours?) un string.
Le plus simple serait que tu stockes directement tes polices. Sinon tu dois récupérer un font en fonction du nom sélectionné.

Whismeril
Commenter la réponse de Whismeril
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 17:31
0
Merci
Ha je me suis fait devancer!!

Whismeril
Commenter la réponse de Whismeril
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 17:42
0
Merci
@Buno : désolé, j'avais oublié que le .Name était de type string.

Sinon tu dois récupérer un font en fonction du nom sélectionné.


c'est ce que je cherche à faire, mais je ne sais pas par où commencer.. une fonction de recherche ?
Commenter la réponse de thibaultlavoisey
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 17:53
0
Merci
Un petit tour sur msnd rubrique class font tableau des contructeurs la

Dans le lot, il y en a qui te permette d'initialiser une police selon le nom....

Whismeril
Commenter la réponse de Whismeril
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 18:06
0
Merci
bon je réfléchi, et je vous tiens au courant
Commenter la réponse de thibaultlavoisey
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 21:39
0
Merci
Re bonsoir,

voilà où j'en suis :

private void btAffiche_Click(object sender, EventArgs e)
{
bool tr = false;
int i = fontfamill.GetLowerBound(0);
int pos = -1;
if (lsbPolice.SelectedItem != null)
{
pos = lsbPolice.SelectedIndex;
while (i <fontfamill.GetUpperBound(0) && (tr false))
{
if (i == pos)
{
lblVisu.Font = fontfamill[i].Font;
}
}
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}

il m'affiche que fontfamill n'existe pas dans le contexte actuel.. pourtant mon array fontfamill charge en même temps que le formulaire, le bouton devrait le connaitre ?

de plus, je ne suis pas très sur de mon code comme je ne peux pas encore le tester..

le voici en entier :

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 Visualisation
{
    public partial class frmVisu : Form
    {
        public frmVisu()
        {
            InitializeComponent();
        }

        private void frmVisu_Load(object sender, EventArgs e)
        {
            System.Drawing.Text.InstalledFontCollection fonts = new
            System.Drawing.Text.InstalledFontCollection();
            FontFamily[] fontfamill = fonts.Families;
            for (long i = fontfamill.GetLowerBound(0); i <= fontfamill.GetUpperBound(0); i++)
                lsbPolice.Items.Add(fontfamill[i].Name);
            fontfamill = null;
            fonts = null;
            lsbPolice.SelectedIndex = 0;

            lblVisu.Text = "Voici le résultat";
        }

        private void btValider_Click(object sender, EventArgs e)
        {
            bool tr = false;
            int i = 0;
            int pos = -1;
            if (txbPolice.Text != null)
            {
                while ((i <lsbPolice.Items.Count) && (tr false))
                {
                    if (txbPolice == lsbPolice.Items[i])
                    {
                        tr = true;
                        pos = i;
                    }
                    else
                        i++;
                }
                if (pos != -1)
                {
                    MessageBox.Show("la police que vous avez saisi existe déjà dans la liste !");
                    txbPolice.Text = null;
                }
                else
                {
                    lsbPolice.Items.Add(txbPolice.Text);
                    txbPolice.Text = null;
                }
            }
            else
                MessageBox.Show("Veuillez saisir la police à ajouter dans la liste !");

        }

        private void btSupprimer_Click(object sender, EventArgs e)
        {
            
            if (lsbPolice.SelectedItem != null)
            {
                lsbPolice.Items.Remove(lsbPolice.SelectedItem);
            }
            else
            {
                MessageBox.Show("Veuillez sélectionner une police à supprimer dans la liste !");
            }
        }

        private void btQuitter_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btAffiche_Click(object sender, EventArgs e)
        {
            bool tr = false;
            int i = fontfamill.GetLowerBound(0);
            int pos = -1;
            if (lsbPolice.SelectedItem != null)
            {
                pos = lsbPolice.SelectedIndex;
                while (i <fontfamill.GetUpperBound(0) && (tr false))
                {
                    if (i == pos)
                    {
                        lblVisu.Font = fontfamill[i].Font;
                    }
                }
            }
            else
            {
                MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
            }
        }
    }
}
Commenter la réponse de thibaultlavoisey
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 22:08
0
Merci
Bonsoir,


fontfamill est déclaré dans frmVisu_Load, donc il n'est accéssible que dans cette méthode.

Pour qu'il soit accessible partout dans ta form, il faut le déclarer en dehors de toute méthode.

Par contre tu peux l'initialiser dans une méthode :

FontFamily[] fontfamill;//déclaration

private void Ailleurs()
{
....
fontfamill = fonts.Families;//initilaisation
...}



dans btAffiche_Click

je pense que

 private void btAffiche_Click(object sender, EventArgs e)
        {
            if (lsbPolice.SelectedItem != null)
            {
                        int pos = lsbPolice.SelectedIndex;
                        lblVisu.Font = fontfamill[pos].Font;
            }
            else
            {
                MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
            }
        }


devrait suffire.

Pense à commenter ton code aussi bien pour nous aujourd'hui que pour toi dans quelques mois, quand on te demandera une modif.
Je suis le premier à rager sur mon manque de rigueur de ce coté!


Je crois comprendre que le bouton Valider te sers à ajouter des polices. Comme au démarrage tu les charges toutes, je suppose que c'est après en avoir supprimer? Je pense qu'on peut rationnaliser aussi.

Whismeril
Commenter la réponse de Whismeril
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 22:19
0
Merci
Et dans l'ergonomie que je t'ai proposée tout à l'heure: l'accés des buttons qu'au moment opportun, tu peux créer une méthode qui gére tous tes boutons.
Tu l'appelles au démarage et à des évenement judicieusement choisis
(lsbPolice_SelectedItemChanged par exemple)
Cela t'éviterait tes if (moins de code au final) et tes messages (à mon sens contraignants pour l'utilisateur) dans chaque méthode.

par exemple
private void lsbPolice_SelectedItemChanged(object sender, EventArgs e)
{
   AccesButtons();
}

private void AccesButtons()
{
   Button1.Visible = (lsbPolice.SelectedItem != null);
   Button2.Enabled = !Button1.Visible;
   ....
}

Whismeril
Commenter la réponse de Whismeril
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 22:23
0
Merci
Ok, pour faire un test en attendant que le code du bouton soit correct j'ai c/coller le code de frmVisu_Load (je sais que ce n'est pas bien, puisque du coup fontfamill est déclaré et initialisé deux fois dans mon formulaire).

puis j'ai modifié le code en conséquence :

private void btAffiche_Click(object sender, EventArgs e)
{
System.Drawing.Text.InstalledFontCollection fonts = new
System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontfamill = fonts.Families;
for (long i = fontfamill.GetLowerBound(0); i <= fontfamill.GetUpperBound(0); i++)
lsbPolice.Items.Add(fontfamill[i].Name);
fontfamill = null;
fonts = null;
lsbPolice.SelectedIndex = 0;

lblVisu.Text = "Voici le résultat";

int pos = -1;
if (lsbPolice.SelectedItem != null)
{
pos = lsbPolice.SelectedIndex;
lblVisu.Font = fontfamill[pos].Name;
}
else
{
MessageBox.Show("Veuillez sélectionner une police à afficher dans la liste !");
}
}

seulement maintenant, je ne peux pas faire lblVisu.Font = fontfamill[pos].Font car ca n'existe pas, il n'y a que .Name de disponible, mais .Name indique un type string, hors .Font est un type Font.

Je pensais que mon code chargeait les polices type font et insérait le nom de ses polices dans ma listbox, ai-je hormis qlqchose ?

& si je mets 'using System.Drawing.Text.InstalledFontCollection;' au début de mon code ?
Commenter la réponse de thibaultlavoisey
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 22:24
0
Merci
j'aime beaucoup l'idée du bouton invisible tant que la condition n'est pas remplie, mais je cherche déjà à coder ce bouton Afficher.. Chaque chose en son temps, sinon je vais plus m'y retrouver ^^'
Commenter la réponse de thibaultlavoisey
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 17 août 2011 à 23:00
0
Merci
fontfamill[] est un tableau de FontFamily(ies), donc fontfamill[pos] est déjà un font(family) (oups je t'ai enduis d'erreurs)

Essaye ça
lblVisu.Font = fontfamill[pos];


ou ça
lblVisu.Font = (Font)fontfamill[pos];


sinon

lblVisu.Font = new Font(fontfamill[pos].Name,20);


Je ne peux pas tester, je n'ai pas mon pc.

Whismeril
Commenter la réponse de Whismeril
thibaultlavoisey 11 Messages postés samedi 12 mars 2011Date d'inscription 18 août 2011 Dernière intervention - 17 août 2011 à 23:31
0
Merci
Bon, je vais me pendre.. :(

lblVisu.Font fontfamill[pos];
> Erreur 1 Impossible de convertir implicitement le type 'System.Drawing.FontFamily' en 'System.Drawing.Font'

lblVisu.Font = (Font)fontfamill[pos];


Erreur 1 Impossible de convertir le type 'System.Drawing.FontFamily' en 'System.Drawing.Font'

lblVisu.Font new Font(fontfamill[pos].Name,20);
> Pas d'erreur, mais lors du débug : L'exception NullReferenceException n'a pas été gérée - La référence d'objet n'est pas définie à une instance d'un objet.

... :(
Commenter la réponse de thibaultlavoisey

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.