Execution variable

Signaler
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
-
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
-
Bonjour à tous,

J'aimerai savoir si il est possible d'executer une commande qui serai placé dans une variable.

Exemple :

J'ai  i = 100 dans la variable string test, je voudrais savoir si
il existe un moyen pour executer la commande qui est entré dans cette
chaine, si oui comment ? merci à tous

duck88

13 réponses

Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Bonjour,
Je ne crois pas qu'il existe un moyen simple de faire cela en C# (dans le genre de la fonction eval() de Perl).
Un moyen (très) compliqué consiste à utiliser la réflection pour créer dynamiquement une méthode exécutant l'instruction demandée ; cela implique de parser "manuellement" la chaîne de caractères et d'émettre les instructions IL correspondantes.
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Voilà,

Je crois qu'il n'y a pas grand chose à rajouter, si ce n'est que si tu nous explique ce que tu veux faire, on pourra peu-être t'indiquer un autre moyen d'y arriver.

Amicalement, SharpMao
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Je recupère dans un fichier de configuration les caracteristiques des
differentes colonnes d'un datagrid, tel que me type, la taille, la
position...


Ce que je voudrais faire c'est créer les colonnes d'après ces
differents parametres. J'avais donc pensé a mettre les differentes
lignes de codes dans des variables et les executer au fur et a mesure
pour les créer.


Existe t'il un moyen simple pour sauvegarder l'ordre des colonnes dans
un fichier de configuration et par la suite les restituer à la demande.


Que me préconiser vous ?


Merci

duck88
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Je pense que le plus simple serait de rassembler dans un objet les paramètres de chaque colonne que tu désires sauvegarder, de créer une collection de ces objets et de sérialiser la collection.

Un exemple :
<hr />// La structure contenant les paramètres d'une colonne
[Serializable()]
public struct ColumnSettings
{
   private int width;
   private int position;

   public int Width
   {
      get {return width;}
      set {width = value;}
   }

   public int Position
   {
      get {return position;}
      set {position = value;}
   }

   public ColumnSettings(int width, int position)
   {
      this.width = width;
      this.position = position;
   }
}

// Ailleurs dans le code
List<ColumnSettings> settings = new List<ColumnSettings>();
XmlSerializer serializer = new XmlSerializer(typeof(List<ColumnSettings>));

// Pour sauvegarder
Stream s = File.Create("settings_file.xml");
serializer.Serialize(s, settings);
s.Close();

// Pour récupérer
Stream s = File.OpenRead("settings_file.xml");
settings = (List<ColumnSettings>) serializer.Deserialize(s);
s.Close();

// Créer les colonnes
foreach (ColumnSettings cs in settings)
{
   DataGridViewColumn column = new DataGridViewColumn();
   column.Width = cs.Width;
   // etc...
}
<hr />
Voilà, ça devrait te donner une idée générale de ce que tu peux faire.
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Merci je vais m'appuyer sur ca pour faire ma sauce.

Encore merci.

duck88
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Une petite question pour finir, est t'il possible de serialiser plusieurs objets dans un meme fichier ?

duck88
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Je viens de faire un test rapide : a priori, non, tu ne peux pas sérialiser plusieurs objets dans un même fichier.

Plus exactement, tu peux sérialiser plusieurs objets dans le même fichier, mais dans ce cas tu ne peux pas désérialiser : une exception InvalidOperationException est lancée lorsque tu tentes de désérialiser à partir d'un fichier dans lequel tu as sérialisé plusiurs objets à la suite.

C'est quan même un peu dommage ; je vais essayer de voir plus en détail dans la doc s'il y a une solution, je te tiens au courant.
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Merci beaucoup de ton aide.

duck88
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Je peux avoir plusieurs type de colonne tel que DataGridViewCheckBoxColumn ou DataGridViewTextBoxColumn,

comment puis je les referencé dans ma classe serialisé ?


Merci.

duck88
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Alors, pour ce qui est de la sérialisation de plusieurs objets dans un même fichier, c'est possible si tu sérialises au format binaire (en utilisant System.Runtime.Serialization.Formatters.Binary.BinaryFormatter au lieu de System.Xml.Serialization.XmlSerializer). L'inconvénient, c'est précisément que le format du fichier est binaire (et non Xml), ce qui le rend difficilement modifiable en dehors de l'application.

Pour enregistrer le type de colonne, tu peux rajouter à la classe un champ de type Type, auquel tu affecteras le type de colonne grâce à l'opérateur typeof().
<hr />// Dans la définition de la structure ColumnSettings
private Type columnType;
public Type ColumnType
{
   get {return columnType;}
   set {columnType = value;}
}

columnSettings.ColumnType = typeof(DataGridViewCheckBoxColumn);<hr />
Du coup, pour recréer la colonne à partir de la structure désérialisée, tu peux faire:
<hr />// Créer une instance à partir du type
DataGridViewColumn column = (DataGridViewColumn)Activator.CreateInstance(columnSettings.ColumnType);
// puis affecter les propriétés comme avant
column.Width = columnSettings.Width
// etc...
<hr />
Voilà.
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Je me demandais s'il ne serait pas plus simple en fait de serialisé
directement le datagrid à la place de la colonne. Est ce que cette
possibilité garderais l'etat des colonnes ?

duck88
Messages postés
129
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
30 décembre 2007
3
Ce serait plus simple, mais ce n'est pas possible, la classe DataGridView n'est pas sérialisable. Les classes DataGridViewColumn et DataGridViewColumnCollection ne le sont pas non plus. C'est justement pour ça que je t'ai conseillé de créer ta propre classe (ou structure) pour stocker les propriétés que tu veux sauvegarder.
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

ok merci bcp pour ton aide

duck88