Overblog Suivre ce blog
Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

16 avril 2014 3 16 /04 /avril /2014 15:07

 

AutoMapper est une librairie permettant de gérer facilement le Mapping et ainsi s'astreindre d'une tâche pas forcément passionnante (écrire une à une ses classes de Mapping)   

  • Chercher « AutoMapper » depuis le Gestionnaire de package NuGet

  • Ou taper dans la console du gestionnaire de package

    PM> Install-Package AutoMapper

     

     

Exemple :

On a

  • une classe Client (concrètement cela pourrait être une classe générée avec EDM ou Linq To SQL) « la source »

  • une classe ClientModel qui sera « la destination »

  • Un service qui permet de récupérer une IList<Client>  et doit renvoyer une IList<ClientModel>

  public class Client

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }

    }

    public class ClientModel

    {

        public int ClientID { get; set; }

        public string ClientFullName { get; set; }

        public string Email { get; set; }

    }

 

 

On définit d’abord le mappage pour la source et la destination

Mapper.CreateMap<Client, ClientModel>()

                .ForMember(c => c.ClientID, options => options.MapFrom(source => source.Id))

                .ForMember(c => c.ClientFullName, options => options.MapFrom(source => source.Name))

                .ForMember(c => c.Email, options => options.MapFrom(source => source.Email));

     

Puis

            foreach (Client clientSource in clients)

            {

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

            }

Plusieurs écritures possibles .Il est possible de définir le nom de chaque propriété soit en chaine de caractères, ou avec une expression(mieux car cela permet d’éviter les erreurs de syntaxe)

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

 

Ou

                ClientModel clientDestination = new ClientModel();

                result.Add(Mapper.Map(clientSource, clientDestination));

Il serait bien sûr possible de mettre en forme la valeur avec string.Format

On peut imaginer d’autres utilisations .Par exemple le mapping entre un « Model » et un « ViewModel »

 

Le service

    public interface IClientService

    {

        IList<ClientModel> GetAll();

    }

    public class ClientService : IClientService

    {

        private IList<Client> clients = new List<Client>(){

                        new Client(){Id=1,Name="Bellin, Marie",Email="bellinmarie@live.com"},

                        new Client(){Id=2,Name="Adams, Terry",Email="adamsterry123@live.com"},

        };

 

        public IList<ClientModel> GetAll()

        {

            IList<ClientModel> result= new List<ClientModel>();

 

            Mapper.CreateMap<Client, ClientModel>()

                .ForMember(c => c.ClientID, options => options.MapFrom(source => source.Id))

                .ForMember(c => c.ClientFullName, options => options.MapFrom(source => source.Name))

                .ForMember(c => c.Email, options => options.MapFrom(source => source.Email));

 

            // la liste de clients pourrait être récupérée avec EDM ou Linq To SQL

            foreach (Client clientSource in clients)

            {

                //ClientModel clientDestination = new ClientModel();

                //result.Add(Mapper.Map(clientSource, clientDestination));

                // ou

                ClientModel clientDestination = Mapper.Map<ClientModel>(clientSource);

                result.Add(clientDestination);

            }

 

            return result;

        }

    }

 

https://github.com/AutoMapper/AutoMapper

Repost 0
Published by Romagny13 - dans C
commenter cet article
14 avril 2014 1 14 /04 /avril /2014 01:41
On parle d’Asynchrone partout, surtout avec  WinRT.On utilise les facilités offertes par le Framework pour effectuer des traitements asynchrones. Il est bon de ne pas oublier ses « bases ».

 

Le délégué

 

  public delegate string DoSomethingHandler(object sender,DoSomethingEventArgs e);

 

 

  public class DoSomethingEventArgs :EventArgs 
    {
        public object Result { get; set; }
        public DoSomethingEventArgs(object result)
        {
            this.Result = result;
        }
    }

 

 

        private void button1_Click(object sender, EventArgs e)
        {
            DoSomething += new DoSomethingHandler(DoSomethingMethod);
            DoSomething.BeginInvoke(this, new DoSomethingEventArgs(null), new AsyncCallback(Callback), null);
        }
        public void Callback(IAsyncResult result)
        {
            DoSomethingHandler handler = ((AsyncResult)result).AsyncDelegate as DoSomethingHandler;
            string message = handler.EndInvoke(result);
            //  
            this.Invoke(new Action(()=> { textBox1.Text = message; }));
        }
        private string DoSomethingMethod(object sender, DoSomethingEventArgs e)
        {
            // simule un traitement long  
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(1000);
                 this.Invoke(new Action(()=> { listBox1.Items.Add(DateTime.Now.ToString("T"));}));
            }
           
            return "un résultat quelconque"; //  
        }
        public event DoSomethingHandler DoSomething;

 

 

Pour vérifier que l’UI n’est pas bloquée on peut rajouter un bouton permettant d’afficher un message

 

  private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("UI réactive !");
        }

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
13 avril 2014 7 13 /04 /avril /2014 18:18

Stream

  • Stream

    • FileStream

    • IsolatedStorageFileStream

    • NetWorkStream

    • SerialPort

     

    Services de flot de données

     

    • AuthenticatedStream

    • CryptoStream

    • BufferedStream

    • MemoryStream  et UnmananagedMemoryStream

    • DeflateStream et GZipStream

       

Typer le flot de données

  • BinaryReader/BinaryWriter

  • TextReader/TextWriter

    • StringReader/StringWriter

    • StreamReader/StreamWriter

       

 

Info

  • FileSystemInfo

    • DirectoryInfo

    • FileInfo

+ Exceptions,Types(Enum)

File

Simple lecture / Ecriture dans des fichiers

string value =  File.ReadAllText(path);

byte[] data = File.ReadAllBytes(path);

foreach (string line in File.ReadAllLines(path)) { }

FileStream fileStream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);

StreamReader streamReader = File.OpenText(path);

// Exceptions

try { return File.ReadAllText(path); }

catch (DirectoryNotFoundException) { }

catch (FileNotFoundException) { }

 

File.WriteAllText(path, value);

File.WriteAllBytes(path,data);

StreamWriter streamWriter = File.AppendText(path);

 

FileStream

Ce qu’il faut pour lire/écrire un flot de données :

Stream

Encodage (UNICODE) + normes UTF-8, etc. (exemple System.Text.UTF8Encoding)

Tableau de byte [] obtenu selon l’encodage

Méthodes lecture/écriture du Stream

        public void WriteFile(string value,string path)

        {

            using (FileStream stream = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                stream.Write(data, 0, data.Length);

            }

        }

        public string ReadFile(string path)

        {

            string result = string.Empty;

            using (FileStream stream = File.OpenRead(path))

            {

                byte[] data = new byte[stream.Length];

                for (int index = 0; index < stream.Length; index++)

                    data[index] = (byte)stream.ReadByte();

                

                result = Encoding.UTF8.GetString(data); 

            }

            return result;

        }

 

Asynchrone

        public  async Task WriteFileAsync(string path,string value)

        {     

                   using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write,FileShare.None, 4096, true))

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                stream.Write(data, 0, data.Length);

 

                await stream.WriteAsync(data, 0, data.Length);

            }

        }

        public async Task<string> ReadFileAsync(string path)

        {

            using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))

            {

                byte[] bytes = new byte[stream.Length];

                int count = (int)stream.Length;

 

                await stream.ReadAsync(bytes, 0, (int)stream.Length);

                return Encoding.UTF8.GetString(bytes);

            }

        }

StreamReader/StreamWriter

public void WriteStream(string value,string path)

        {

            using (StreamWriter streamWriter = File.CreateText(path))

            {

                streamWriter.Write(value);

            }

        }

        public async Task WriteStreamAsync(string value, string path)

        {

            using (StreamWriter streamWriter = File.CreateText(path))

            {

               await streamWriter.WriteAsync(value);

            }

        }

        public string ReadStream(string path)

        {

            using (StreamReader streamReader = File.OpenText(path))

            {

                return streamReader.ReadToEnd();

            }

        }

        public async Task<string> ReadStreamAsync(string path)

        {

            using (StreamReader streamReader = File.OpenText(path))

            {

                return await streamReader.ReadToEndAsync();

            }

        }

WebRequest/WebResponse

flot de données distant  

  public string GetWebResponse(string uri)

        {

            WebRequest request = WebRequest.Create(uri);

            using (WebResponse response = request.GetResponse())

            {

                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))

                {

                    return streamReader.ReadToEnd();

                }

            }

        }

        public async Task<string> GetWebResponseAsync(string uri)

        {

            WebRequest request = WebRequest.Create(uri);

            using (WebResponse response = await request.GetResponseAsync())

            {

                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))

                {

                    return streamReader.ReadToEnd();

                }

            }

        }

 

FtpWebRequest

public async Task UploadFileAsync(string uri,string login,string password,string value)

        {

            FtpWebRequest request = WebRequest.Create(uri) as FtpWebRequest;

            request.Credentials = new NetworkCredential(login, password);

            request.Method = WebRequestMethods.Ftp.UploadFile;

 

            using (Stream stream = await request.GetRequestStreamAsync())

            {

                byte[] data = new UTF8Encoding(true).GetBytes(value);

                await stream.WriteAsync(data, 0, data.Length);

            }           

        }

 

Utilisation .Exemple

string value = @"<!DOCTYPE html>

<html xmlns=""http://www.w3.org/1999/xhtml"">

    <head>

        <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />

    </head>

    <body>

        <h1>Page de test</h1>

    </body>

</html>";

 

 

 

await UploadFileAsync(

"ftp://ftp.nomserveur.org/index.html", "votreidentifiant", "votrepassword",value);  

 

 

+ Path

 

http://msdn.microsoft.com/fr-fr/library/system.io.path(v=vs.110).aspx

 

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
11 avril 2014 5 11 /04 /avril /2014 17:16

1- Opérateurs

           // 1 

            int? x = null;

            int y = x ?? -1; //si x est null y = -1 sinon y vaut x

 

            // 2

            int? a = null;

            int? b = 5;

            int c = a ?? b ?? -1; // c=5 si a et b avaient été "null" alors c aurait été égal à -1

 

            // 3

            bool p = false;

            int result = !p ? 0 : 1; // si p est false result = 0 sinon result=1    

 

2-string.Format() et ToString()

 

// ToString() + localisation 

decimal price = 9.99M;

MessageBox.Show(price.ToString("C",new CultureInfo("en-US")));

// string.Format 

MessageBox.Show(string.Format("{0:C}", 9.99M));


Nombres

C or c Currency $12,345.67

D or d Decimal (integer types only) 12345

E or e Scientific notation 1.234567E+004

F or f Fixed-point 12345.67

G or g General (fixed-point or scientific, whichever is shorter) 12345.67

N or n Number (with decimal and thousands separators) 12,345.67

P or p Percent (multiplied by 100 and % added) 0.12 becomes 12.00 %

X or x Hexadecimal (integer types only) 3039

 

DateTime

d: 6/15/2008

D: Sunday, June 15, 2008

f: Sunday, June 15, 2008 9:15 PM

F: Sunday, June 15, 2008 9:15:07 PM

g: 6/15/2008 9:15 PM

G: 6/15/2008 9:15:07 PM

m: June 15

o: 2008-06-15T21:15:07.0000000

R: Sun, 15 Jun 2008 21:15:07 GMT

s: 2008-06-15T21:15:07

t: 9:15 PM

T: 9:15:07 PM

u: 2008-06-15 21:15:07Z

U: Monday, June 16, 2008 4:15:07 AM

y: June, 2008

 

'h:mm:ss.ff t': 9:15:07.00 P

'd MMM yyyy': 15 Jun 2008

'HH:mm:ss.f': 21:15:07.0

'dd MMM HH:mm:ss': 15 Jun 21:15:07

'\Mon\t\h\: M': Month: 6

'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

T Long time 2:15:16 PM

y or Y Year/month March, 2014

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
11 avril 2014 5 11 /04 /avril /2014 17:11

Il est conseillé de préférer l’utilisation des méthodes asynchrones pour des UI réactives.

Une tâche ne renvoyant pas de résultat : on emploie juste le mot « Task »
Pour une tâche renvoyant un résultat : on emploie « Task<T> » (T étant le type de retour , par exemple string)
Exemple de tâche ne renvoyant pas de résultat (écrit un fichier de manière asynchrone)
public async Task CreateAndWriteAsyncToFile()
        {
            using (FileStream stream = new FileStream("test.dat", FileMode.Create,
                FileAccess.Write, FileShare.None, 4096, true))
            {
                byte[] data = new byte[100000];
                new Random().NextBytes(data);
                await stream.WriteAsync(data, 0, data.Length);
            }
        }
Utilisation
  private async void button1_Click(object sender, EventArgs e)
        {
          await CreateAndWriteAsyncToFile ();
        } 
Exemple de tâche renvoyant un résultat
        private async void btWriteFile_Click(object sender, EventArgs e)
        {
          string response = await GetHttpClientStringAsync("http://www.microsoft.com");
        }
        public async Task<string> GetHttpClientStringAsync(string path)
        {
            HttpClient client = new HttpClient();
            return await client.GetStringAsync(path);
        }
Gestion Erreur + annulation de la tâche
  public static void Main()
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken token = cancellationTokenSource.Token;
            Task task = Task.Run(() =>
            {
                while (!token.IsCancellationRequested)
                {
                    Console.Write("*");
                    Thread.Sleep(1000);
                }
                // simule une erreur 
                //token.ThrowIfCancellationRequested();  
            }, token);
            try 
            {
                Console.WriteLine("Press enter to stop the task");
                Console.ReadLine();
                cancellationTokenSource.Cancel();
                task.Wait();
            }
            catch (AggregateException e)
            {
                Console.WriteLine(e.InnerExceptions[0].Message);
            }
            Console.WriteLine("Press enter to end the application");
            Console.ReadLine();
        }
Tâches multiples
public async Task ExecuteMultipleRequests()
        {
            HttpClient client = new HttpClient();
            string microsoft = await client.GetStringAsync("http://www.microsoft.com");
            string msdn = await client.GetStringAsync("http://msdn.microsoft.com");
            string blogs = await client.GetStringAsync("http://blogs.msdn.com/");
            //On pourrait afficher le résultat par exemple : rtb.AppendText(microsoft); 
        }
 L’inconvénient ici est qu’il va falloir attendre que les 3 tâches soient exécutées .En exécutant ces tâches de façon parallèle (avec WhenAll) il n’y a qu’à attendre que la plus longue des tâches soit finie
Parallèle
  public async Task ExecuteMultipleRequestsInParallel()
        {
            HttpClient client = new HttpClient();
            Task microsoft = client.GetStringAsync("http://www.microsoft.com");
            Task msdn = client.GetStringAsync("http://msdn.microsoft.com");
            Task blogs = client.GetStringAsync("http://blogs.msdn.com/");
            await Task.WhenAll(microsoft, msdn, blogs);
        }
Données – Lecture et mise à jour asynchrones
    private async void btReadData_Click(object sender, EventArgs e)
        {
            List<Client> clients = await GetAllClientsAsync();
            dataGridView1.DataSource = clients;
            // mise à jour 
            int result = await DeleteClientAsync(1978);
        }
      
        public async Task<List<Client>> GetAllClientsAsync()
        {
            List<Client> result = new List<Client>();
            using (DbConnection connection = GetConnection())
            {
                using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT [Id],[Name],[Email] FROM [dbo].[Client]";
                    await connection.OpenAsync();
                    using (DbDataReader reader = await command.ExecuteReaderAsync())
                    {
                        while (await reader.ReadAsync())
                        {
                            Client client = new Client();
                            client.ClientID = reader["Id"] == DBNull.Value ? default(int) : int.Parse(reader["Id"].ToString());
                            client.ClientName = reader["Name"] == DBNull.Value ? default(string) : reader["Name"].ToString();
                            client.Email = reader["Email"] == DBNull.Value ? default(string) : reader["Email"].ToString();
                            result.Add(client);
                        }
                    }
                }
            }
            return result;
        }
        public async Task<int> DeleteClientAsync(int id)
        {
            int result = 0;
            using (DbConnection connection = GetConnection())
            {
                using (DbCommand command = connection.CreateCommand())
                {
                    command.CommandText = "Delete from [dbo].[Client] where id=@id";
                    command.Parameters.Add(CreateParameter(command, "@id",id));
                    await connection.OpenAsync();
                    result = await command.ExecuteNonQueryAsync();
                }
            }
            return result;
        }
        // Méthodes d'aide 
        public DbConnection GetConnection()
        {
            ConnectionStringSettings csSection = ConfigurationManager.ConnectionStrings["defaultConnectionString"];
            DbConnection connection = DbProviderFactories.GetFactory(csSection.ProviderName).CreateConnection();
            connection.ConnectionString = csSection.ConnectionString;
            return connection;
        }
        public DbParameter CreateParameter(DbCommand command, string parameterName, object value)
        {
            DbParameter parameter = command.CreateParameter();
            parameter.ParameterName = parameterName;
            parameter.Value = value;
            return parameter;
        }
A noter que je pourrais aussi créer des méthodes d’extension .Exemple
public static class DbCommandExtensions 
    {
        public static DbParameter CreateParameter(this DbCommand command, string parameterName, object value)
        {
            DbParameter parameter = command.CreateParameter();
            parameter.ParameterName = parameterName;
            parameter.Value = value;
            return parameter;
        }
    }
Repost 0
Published by Romagny13 - dans C
commenter cet article
11 avril 2014 5 11 /04 /avril /2014 17:11

http://json.codeplex.com/

 

http://james.newtonking.com/json/help/index.html

 

 

Avec JSon.NET

  public void SerializeJSonClient(Client client)

        {

            JsonSerializer serializer = new JsonSerializer();

            serializer.NullValueHandling = NullValueHandling.Ignore;

 

            using (StreamWriter streamWriter = new StreamWriter("json.txt"))

            {

                using (JsonWriter jsonWriter = new JsonTextWriter(streamWriter))

                {

                    serializer.Serialize(jsonWriter, client);

                }

            }

        }

        public Client DeserializeJSonClient(string path)

        {

            using (StreamReader streamReader = new StreamReader(path))

            {

                string value =  streamReader.ReadToEnd();

                return JsonConvert.DeserializeObject<Client>(value);

            }

        }

Classe générique avec  DataContractJsonSerializer

public class JsonGenericSerializer<TEntity> where TEntity : class,new()

    {

        public static void WriteFile(TEntity entity,string path)

        {

            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))

            {

                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TEntity));

                serializer.WriteObject(stream, entity);

            }

        }

        public static TEntity ReadFile(string path)

        {

            using (FileStream stream = new FileStream(path, FileMode.Open))

            {

                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TEntity));

                StreamReader streamReader = new StreamReader(stream);

                return (TEntity)serializer.ReadObject(stream);

            }

        }

    }

La classe de l’exemple (les paramètres permettent de redéfinir notamment les noms)

  [DataContract(Name="Client")]

    public class Client 

    {

        [DataMember(Name="Id")]

        public int ClientID { get; set; }

        [DataMember(Name = "FirstName")]

        public string ClientFirstName { get; set; }

        [DataMember(Name = "LastName")]

        public string ClientLastName { get; set; }

        [DataMember(Name = "Email")]

        public string Email { get; set; }

    }

Utilisation

Client client=new Client(){ClientID=1,ClientFirstName="Marie",ClientLastName="Bellin",Email="bellinmarie@live.com"};

//   SerializeJSonClient(client);

JsonGenericSerializer<Client>.WriteFile(client,"demo.txt");

 

 

// Client result = DeserializeJSonClient("json.txt");

Client result = JsonGenericSerializer<Client>.ReadFile("demo.txt");

 

 

Le fichier généré

{"Email":"bellinmarie@live.com","FirstName":"Marie","Id":1,"LastName":"Bellin"}

Repost 0
Published by Romagny13 - dans C
commenter cet article
29 mars 2014 6 29 /03 /mars /2014 13:21

ListCollectionView est la vue par défaut sur une collection implémentant IList .
 
Une vue permet de filtrer, trier et naviguer facilement(ancien article en parlant) mais permet aussi de gérer les opérations d’ajout d’un nouvel élément, modification et suppression.

1-Ajout :
L’intérêt est de pouvoir annuler un ajout à la collection facilement.
  • AddNew()  ajoute l’élément à la collection et à la vue(mais est également le CurrentItem et CurrentAddItem de la vue,IsAddinNew = true)
  • CancelNew() supprime l’élément en cours d’ajout de la collection et la vue(CurrentItem ,CurrentAddItem,IsAddindNew=false)
  • CommitNew() CurrentAddItem ne pointe plus sur l’objet,IsAddind= false , l’objet appartient à la collection et à la vue comme un autre élément .

 

Exemple (Articles est une ObservableCollection<Article>)
public ListCollectionView View { get; set; }

 

View = (ListCollectionView)(CollectionViewSource.GetDefaultView(context.Articles));

 

Article newArticle = (Article)View.AddNew();
newArticle.ArticleID = Guid.NewGuid();
newArticle.ArticleName = "Jeans bleu délavé";
newArticle.Description = "joli jeans bleu clair délavé";
newArticle.CollectionID = 1;

 

// Sur un bouton « Ok » par exemple
View.CommitNew();

       
 

// Sur un bouton « Annuler »
View.CancelNew();



Note : AddNewItem(object item) fonctionne de la même manière que AddNew()
  
2-Modification :
Tout l’intérêt ici est de pouvoir annuler les changements apportés à un objet de la collection (la classe doit avoir implémenté IEditableObject)
  • EditItem(object item) spécifie l’objet qui va être édité(CurrentEditItem,IsEditingItem=true)
  • CancelEdit() permet d’annuler les changements sur l’objet(l’objet n’est plus CurrentEditItem et isEditingItem=false)
  • CommitEdit() valide les changements(l’objet n’est plus CurrentEditItem et isEditingItem=false)    

 

Exemple :
Article article =(Article) View.CurrentItem;
View.EditItem(article);

 

article.ArticleName = "Jeans xxy";

 

//    
View.CancelEdit();

 

//      
View.CommitEdit();

 

3-Suppression :
On peut aussi passer par la vue avec les méthodes Remove(object item) ou RemoveAt(int index) pour supprimer un objet de la collection
Exemple
   Article article =(Article) View.CurrentItem;
 
   View.Remove(article);



Repost 0
Published by Romagny13 - dans C
commenter cet article
18 février 2014 2 18 /02 /février /2014 00:14

 

"On code d’abord" et la base de données est générée ensuite par rapport à ce que l’on code.

Ressources
Intéressant MVC5 + OAuth et Windows Azure
Intallation du nuget Entity Framework
Quelques commandes(dans la console de gestion du package de visual Studio)
enable-migrations
add-migration Initial
Update-Database

 

Exemple
Je n’indique pas la base de données dans la chaine de connexion du fichier de configuration .Una base de données SQL Server va être générée  à l’éxécution de application .
-    le nom de la chaine de connexion est identique au datacontext(ClientContext ici)

La base générée : CodeFirstDemo.DAL.ClientContext

 

 

  <connectionStrings>
    <add name="ClientContext"
         connectionString="data source=.\SQLEXPRESS;integrated security=True;" providerName="System.Data.EntityClient" />
  </connectionStrings>

 

public class ClientContext : DbContext
    {
        public DbSet<Client> Clients { get; set; }
    }
    public class ClientProvider
    {
        ClientContext context = new ClientContext();
 
        public List<Client> GetAllClients()
        {
                return context.Clients.ToList();
        }
    }
public class Client
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public int CategoryId { get; set; }
    }

 

MainForm
  private void MainForm_Load(object sender, EventArgs e)
        {
            ClientProvider provider = new ClientProvider();
 
            dataGridView1.DataSource = provider.GetAllClients();
   
        }   

 

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
2 février 2014 7 02 /02 /février /2014 01:42

binding0.png

(Les méthodes GetClients() et GetCategories() retournent une liste générique)

        public MainWindow()

        {

            InitializeComponent();

 

            Clients = new CollectionViewSource() { Source = GetClients() };

            cboCategoryClient.ItemsSource = GetCategories();

 

            this.DataContext = Clients;

            this.View = (CollectionView)(CollectionViewSource.GetDefaultView(this.Clients.View));

        }

 

        public CollectionViewSource Clients { get; set; }

        private CollectionView View;

1-Navigation

IsSynchronizedWithCurrentItem="True"(du datagrid) permet de synchroniser avec l’item courant. Il est possible aussi de le gérer par code .

  private void btnFirst_Click(object sender, System.Windows.RoutedEventArgs e)

        {

            this.View.MoveCurrentToFirst();

        }

 

        private void btnPrevious_Click(object sender, System.Windows.RoutedEventArgs e)

        {

            if ((this.View.CurrentPosition > 0))

            {

                this.View.MoveCurrentToPrevious();

            }

        }

 

        private void btnNext_Click(object sender, System.Windows.RoutedEventArgs e)

        {

            if ((this.View.CurrentPosition < (this.View.Count - 1)))

            {

                this.View.MoveCurrentToNext();

            }

        }

 

        private void btnLast_Click(object sender, System.Windows.RoutedEventArgs e)

        {

            this.View.MoveCurrentToLast();

        }

 

        // Lorsqu'on sélectionne une ligne dans le datagrid, l'élément est affiché dans la vue détail

        private void dgClients_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            View.MoveCurrentTo(dgClients.SelectedItem);

        }

        // synchronise l'élément sélectionné dans le datagrid avec l'élément affiché dans la vue détail lors de la navigation

        void View_CurrentChanged(object sender, EventArgs e)

        {

            dgClients.SelectedItem = View.CurrentItem;

        }

2-Tri

private void btnSort_Click(object sender, RoutedEventArgs e)

        {

            //Clients.View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

            //ou

            View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

        }

3-Filtre

private void btnFilter_Click(object sender, RoutedEventArgs e)

        {

            // Clients.View.Filter = FilterClient;

            // Clients.View.Filter = new Predicate<object>(Client => ((Client)Client).Name.Contains("B"));

            // OU

            //View.Filter = FilterClient;

                View.Filter = new Predicate<object>(Client => ((Client)Client).Name.ToLower().Contains(txtFilter.Text.ToLower().Trim()));

 

        }       

        // Filtre

        private bool FilterClient(object item)

        {

            Client client = item as Client;

 

            return client.Name.Contains(txtFilter.Text);

        }

     

Xaml

<StackPanel>

        <StackPanel>

            <Label Name="lblId" Height="23" Content="{Binding Id}"/>

            <TextBox Name="txtName" Height="23" TextWrapping="Wrap" Text="{Binding Name}"/>

            <TextBox Name="txtEmail" Height="23" TextWrapping="Wrap"  Text="{Binding Email}"/>

            <ComboBox Height="20" Name="cboCategoryClient"

                      ItemsSource="{Binding}"

                      DisplayMemberPath="Name"

                      SelectedValuePath="Id"

                      SelectedValue="{Binding CategoryId}"

                      />

        </StackPanel>

        <StackPanel Orientation="Horizontal">

            <Button HorizontalAlignment="Left" Name="btnFirst" Width="36" Height="25" VerticalAlignment="Top" Click="btnFirst_Click">|&lt;</Button>

            <Button HorizontalAlignment="Left" Name="btnPrevious" Width="36" Height="25" VerticalAlignment="Top" Click="btnPrevious_Click">&lt;</Button>

            <Button HorizontalAlignment="Left" Name="btnNext"  Width="36" Height="25" VerticalAlignment="Top" Click="btnNext_Click">&gt;</Button>

            <Button HorizontalAlignment="Left"  Name="btnLast" Width="36" Height="25" VerticalAlignment="Top" Click="btnLast_Click">&gt;|</Button>

            <TextBox Name="txtFilter" Width="100"/>

            <Button Name="btnFilter" Content="Filtrer"  Click="btnFilter_Click"/>

            <Button x:Name="btnSort" Content="Trier"  Click="btnSort_Click" />                

        </StackPanel>

        <StackPanel>

            <DataGrid Name="dgClients" ItemsSource="{Binding}" SelectionChanged="dgClients_SelectionChanged" Height="208"/>

        </StackPanel>

    </StackPanel>

Repost 0
Published by Romagny13 - dans C
commenter cet article
2 février 2014 7 02 /02 /février /2014 01:41

wpfbind1

3-Vue détail + ComboBox

Clients = new ObservableCollection<Client>(GetClients());

Categories = new ObservableCollection<Category>(GetCategories());

 

cboCategoryClient.ItemsSource = Categories;

 

DataContext = this;     

  
  •  On définit la propriété SelectedItem du datagrid (réglée sur le property SelectedClient ici) 
  •  On définit le  DataContext du conteneur de la vue détail
  • ItemsSource de la comboBox est définie dans le code behind, dans le Xaml on définit juste {Binding}  

<DataGrid x:Name="datagridClients" Height="150" ItemsSource="{Binding Clients}" SelectedItem="{Binding SelectedClient}" Grid.Row="0" AutoGenerateColumns="False" SelectionChanged="datagridClients_SelectionChanged">     

            <DataGrid.Columns>

                <DataGridTextColumn Header="Nom" Binding="{Binding Name}"/>

                <DataGridTextColumn Header="E-mail" Binding="{Binding Email}"/>

            </DataGrid.Columns>

        </DataGrid>

 

            <StackPanel DataContext="{Binding SelectedItem, ElementName=datagridClients}" Grid.Row="1">

            <TextBlock Height="20" Width="120" Name="txtClientId" Text="{Binding Path=Id}"/>

            <TextBox Height="20" Width="120" Name="txtClientName" Text="{Binding Name}"/>

            <TextBox Height="20" Width="120" Name="txtClientEmail" Text="{Binding Email}"/>

            <ComboBox Height="20" Name="cboCategoryClient"

                      ItemsSource="{Binding}"

                      DisplayMemberPath="Name"

                      SelectedValuePath="Id"

                      SelectedValue="{Binding CategoryId}"

                      />

        </StackPanel>

 

Variante :

Il est possible de définir en code

<ComboBox Height="20" Name="cboCategoryClient"/>

 

public MainWindow()

        {

            InitializeComponent();

 

            Clients = new ObservableCollection<Client>(GetClients());

            DataContext = this;

 

            Categories = new ObservableCollection<Category>(GetCategories());

            cboCategoryClient.ItemsSource = Categories;

            cboCategoryClient.DisplayMemberPath = "Name"; // valeur affichée

            cboCategoryClient.SelectedValuePath = "Id"; // valeur cachée(clé primaire de la table mère)

 

       public Client SelectedClient { get; set; }

 

        public ObservableCollection<Client> Clients

        {

            get;

            set;

        }

        public ObservableCollection<Category> Categories

        {

            get;

            set;

        }

 

On définit l’élément sélectionné dans l’event SelectionChanged du datagrid

private void datagridClients_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            cboCategoryClient.SelectedValue = SelectedClient.CategoryId;

        }

 

3 – Avec CollectionViewSource

L’ItemsSource du datagrid et de la comboBox se règlent sur la View de la collectionViewSource

   public MainWindow()

        {

            InitializeComponent();

         

            Clients = new CollectionViewSource() { Source = GetClients() };

            Categories = new CollectionViewSource() { Source = GetCategories() };

 

            cboCategoryClient.ItemsSource = Categories.View;

 

            DataContext = this;     

 

       

        }

 

        public Client SelectedClient { get; set; }

 

        public CollectionViewSource Clients

        {

            get;

            set;

        }

        public CollectionViewSource Categories

        {

            get;

            set;

        }

 

    <DataGrid x:Name="datagridClients" Height="150" ItemsSource="{Binding Clients.View}" SelectedItem="{Binding SelectedClient}" Grid.Row="0" AutoGenerateColumns="False" SelectionChanged="datagridClients_SelectionChanged">

            <DataGrid.Columns>

                <DataGridTextColumn Header="Nom" Binding="{Binding Name}"/>

                <DataGridTextColumn Header="E-mail" Binding="{Binding Email}"/>

            </DataGrid.Columns>

        </DataGrid>

        <StackPanel DataContext="{Binding SelectedItem, ElementName=datagridClients}" Grid.Row="1">

            <TextBlock Height="20" Width="120" Name="txtClientId" Text="{Binding Id}"/>

            <TextBox Height="20" Width="120" Name="txtClientName" Text="{Binding Name}"/>

            <TextBox Height="20" Width="120" Name="txtClientEmail" Text="{Binding Email}"/>

 

            <!--<ComboBox Height="20" Name="cboCategoryClient"/>-->

            <ComboBox Height="20" Name="cboCategoryClient"

                      ItemsSource="{Binding}"

                      DisplayMemberPath="Name"

                      SelectedValuePath="Id"

                      SelectedValue="{Binding CategoryId}"

                      />

        </StackPanel>

 

 

Repost 0
Published by Romagny13 - dans C
commenter cet article