Archives de Tag: c#

Transaction Entity Framework

Gestion des transactions en C# avec Entity Framework

using System.Transactions;

using (TransactionScope scope = new TransactionScope())
{
    try{
        //TODO

        //Validation de la transaction
        scope.Complete();
    }
    catch(Exception){
        //Annulation de la transaction
        scope.Dispose();
    }
}
Publicités

Afficher un byte en hexadécimal

Alors que je travaillais sur les couleurs en Razor afin d’afficher des nuances dans des tableaux est arrivé un problème épineux. Comment afficher un byte en hexadécimal puisque par défaut, il retranscrit le byte sous forme de nombre de 0 à 255…

byte foo = 1;
byte bar = 0xFF;

foo.ToString();
bar.ToString();
bar.ToString("X2");

//return 1
//return 255
//return FF

Aide MSDN

Création de clé primaire composé en MVC3

Vous avez une table jointe, voiçi comment déclarer les clé primaires composé en MVC3.

Il suffit de les définir dans le Context comme ceçi :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<RencontreClass>().HasKey(t => new { t.UserId, t.ClientId });
}

Source

Récupérer le numéro de la semaine en cours – C#

Comment récupérer de manière simple, le numéro de la semaine en cours en C#.

Après avoir fait une petite recherche sur Wikipédia, j’ai découvert que la 1ère semaine de l’année est la première qui possède un jeudi dans la nouvelle année. Wikipédia

Donc mon esprit de codeur à tout de suite imaginé une manière fantaisiste. Puis j’ai découvert une solution beaucoup plus simple :

int Semaine = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)

C’est beaucoup plus simple. Et vous pouvez vérifier le résultat sur ce site :
Numéro de Semaine

Source

ForEach Enum

Comment réaliser un foreach sur une énumérations :

L’énum :

enum MitEnum
{
    Toto = 0,
    Titi,
    Tata
}

Et le code :

static void Main(string[] args)
{
    foreach(MitEnum item in Enum.GetValues(typeof (MitEnum)))
    {
        // ...
    }
}

Source

Peuplement du DropDownList

Pour le peuplement d’une DropDownList avec Razor pour du MVC directement dans la page cshtml.

Je vous propose deux solutions qui rempliront une DDL avec des nombres de 0 à 100 et un pas de 5 :

La première, la plus simple, on pose simplement à l’endroit souhaité :

@Html.DropDownListFor(model => model.Pourcentage, new SelectList(Enumerable.Range(0, 100).Where(i => i % 5 == 0))) %

C’est simple, utilise les expressions lambda.

Et pour ceux qui ne sont pas fan, voici la version plus longues, mais tout aussi efficaces :

@{
    List<SelectListItem> list = new List<SelectListItem>(); 
        for (int i = 0; i <= 100; i+=5) 
        {     
            list.Add(new SelectListItem { 
                Text = i.ToString(),
                Value = i.ToString()
            });
        }
}

@Html.DropDownListFor(x => x.Pourcentage, list) %

Comparaison d’un Enum

Petit tuto pour comparer deux Enumérations (en LinQ sur un modèle MVC).

D’abord la définition de l’énumération :

public enum MitEnum : int
{
    Toto = 0,
    Tata = 1,
    Titi = 2,
    Tutu = 3,
}

Ensuite la déclaration dans l’objet :

public int EnumID { get; set; }
public virtual MitEnum TxTx
{
    get { return (MitEnum)EnumID; }
    set { EnumID = (int)value; }
}

Et enfin le comparaison :

var listToto = listFoo.Where(s => s.EnumID == (int) MitEnum.Toto);

Dans ce cas, je récupère tous les éléments de listFoo dont mon énumération MitEnum est « Toto » et je les mets dans listToto… Simplement

DropDownList en Cascade – MVC Razor

Voici une petit tutorial pour créer un effet de cascade sur les DropDownList en MVC Razor.

Nous partirons sur un modele de Marque et de Voiture. Simple. Marque 1.n –> 1.1 Voiture. Avec ID et Libelle.
Déjà nous avons besoin dans la vue de 2 DropDownList.

Vue :

@Html.DropDownListFor(model => model.MarqueID, Model.Marques, new { onChange = "MarqueDDL()"})
@Html.ValidationMessageFor(model => model.MarqueID)

@Html.DropDownListFor(model => model.VoitureID, Model.Voitures)
@Html.ValidationMessageFor(model => model.VoitureID)

Vous pouvez passez par le ViewBag, personnellement j’ai opter pour une ViewModel plus simple.

Ensuite chargons les valeurs dans le contrôleur lors de l’appelle de la page. :
Controller :

model.MarqueID = 0;
model.Marques = new SelectList(db.Marque, "MarqueID", "Libelle", model.MarqueID);
model.Voitures = new SelectList(db.Voiture.Where(x => x.MarqueID == model.MarqueID), "VoitureID", "Libelle");

On retourne dans la Vue pour implementer la fonctions de cascade :
Vue

function ProjetDDL() {
    var DDLparent = '#MarqueID'
    var DDLchild = '#VoitureID'
    cascade('@Url.Action("getVoitures")', 'marqID', $(DDLchild), false, DDLparent );
}

function cascade(url, paramName, childSelect, childCascade, parent) {
    var selectedValue = $(parent).val();
    var params = {};
    params[paramName] = selectedValue;

    childSelect.empty();
    $.getJSON(url, params, function (items) {
        $.each(items, function (index, item) {
            childSelect.append($('').attr('value', item.Id).text(item.Name));
            if (item.Selected) {
                $(childSelect).children().last().attr("selected", true);
            }
        });
        if (childCascade) { childSelect.change(); }
    });
}

La fonction cascade est une adaptation du script que l’on peut trouver ici.
Cette fonction demande les paramètres suivant : l’URL de la fonction qui retournera la nouvelle liste à afficher (voir çi-dessous), le nom paramètre d’entrée (et non sa valeur), la DropDownList à peupler, si la DropDownList peupler va entraîner une nouvelle cascade, et la DropDownList qui vient d’être modifier.

Et nous retournons dans le contrôleur pour renvoyé à la vue les valeurs de la DropDownList enfant.

Controller

[HttpGet]
public ActionResult getVoitures(int marqID)
{
    //Récupération via un paramètre
    //Id et Name sont obligatoire, même pour des Enumerable
    var voitures = db.Voiture.Where(x => x.MarqueID == marqID).Select(
        x => new
        {
            Id = x.LotID,
            Name = x.Libelle
        });
    return Json(voitures, JsonRequestBehavior.AllowGet);
}

Vous remarquerez que le nom de la variable d’entrée est celle qui a été indiqué dans la fonction en JS cascade().

Petit bonus, si vous souhaitez préselectionner une valeur dans la DropDownList enfant, il suffit lors de la création de la SelectList d’indiqué le paramètre Selected à true comme ceçi :

var voitures = db.Voiture.Where(x => x.MarqueID == marqID).Select(
    x => new
    {
        Id = x.VoitureID,
        Name = x.Libelle,
        Selected = x.MiseEnAvant == true ? true : false
    });

Dans cet exemple, j’ai une variable MiseEnAvant de type bool, mais ça pourrait être un int, un string une valeur par défaut.

Update : Problème de Cache sous IE 7 – 8

Voir en bas de ce billet précédent

Volatile – C#

Petit cours de C#

Vous connaissez sûrement les différents modificateur d’accès C#. const, readonly, static. Mais volatile ??

http://msdn.microsoft.com/fr-fr/library/x13ttww7(v=vs.80).aspx

Volatile c’est une manière d’obtenir la dernière valeur d’une variable. Rien ne vaut l’exemple :

 class Test {
    int foo;
    static void Main()
    {
        var test = new Test();
        new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start();
        while (test.foo != 255) ;
        Console.WriteLine("OK");
    }
}

//output rien du tout
//si on rajoute volatile : output : OK

Attention il faut lancé sans le mode débogage (Ctrl + F5)

Exemple tiré de StackOverflow ici.

Sans déclaré volatile, le code est optimisé et donc le programme ne va pas chercher la nouvelle valeur de ‘foo’ qui reste donc à 0. Et le code va attendre à la ligne while (test.foo != 255) ;

volatile

En déclarant foo volatile, lorsque la variable est modifié par un autre processus, l’impact se fait ressentir sur tous les processus, puisque le programme va aller chercher la valeur à chaque fois. Ainsi au bout des 500ms du thread le message OK va apparaître.