Sorry, there are no translations available at the moment.

Ajout et suppression - À partir d'une grille

Description

Dans ce tutoriel, nous allons apprendre à utiliser la ligne d'ajout de nouvel item qui se trouve dans les grilles ("Add Item Row"). Nous allons ajouter le code nécessaire à l'ajout d'une commande ("Order") ainsi qu'a l'ajout d'une ligne de commande ("OrderDetail").

De plus, nous allons apprendre à utiliser la touche Suppr ("Del") du clavier afin de supprimer un item qui se trouve dans une grille.

    Ouverture de la solution

  1. Télécharger la solution finale du chapitre précédent : disponible ici

  2. Décompresser le fichier que vous venez de télécharger

  3. Ouvrir le fichier de solution "DevForce01.sln" dans Visual Studio 2008

  4. Assigner le projet "WinForms01" comme projet de démarrage :

    • À partir du paneau d'exploration de solution, cliquez avec le bouton droit de la souris sur le projet "WinForms01"
    • Cliquer sur "Set as StartUp Project"


  5. Ouvrir (en mode code) le fichier "programm.cs" qui se trouve dans le projet "WinForms01". Trouver la ligne suivante :

     
              Application.Run(new ProductForm());
     

    Et la remplacer par les lignes suivantes :

     
              //The following line dictate to our program witch form should be openned when we start the application
              Application.Run(new EmployeeForm());
     
  6. Démarrer l'application pour vous assurez que ça fonctionne.

  7. Ajout de la grille pour les lignes de commandes

  8. Ouvrir (en mode Design) le fichier "EmployeeForm.cs"

  9. Glisser et configurer les contrôles suivants:

    Type de contrôle Nom ("Name")
    DataGridViewBindingManager_orderDetailsDataGridViewBindingManager
    BindingSource_orderDetailsBindingSource

  10. Configurer le contrôle "_orderDetailsDataGridViewBindingManager" :

    • Cliquer sur le "SmartTag", puis sur "Configure Databindings"
    • Cocher "Show all referenced assemblies"
    • Selectionner "DomainModel" dans la liste du haut et "OrderDetail" dans la liste du bas
    • Cliquer sur "OK"
    • Glisser les colonnes "Quantity", "Product", "UnitPrice" et "Discount"
    • Pour la colonne "Product", sélectionner "DataGridViewComboBoxColumn" pour le "Control Type" et "ListConverter" pour le "Data Converter", puis cliquer sur le bouton à la fin de la ligne (flèche no.3)
    • Cliquer sur le bouton "Create List"
    • Nommer la liste "_productsBindingSource", puis cliquer sur "OK"
    • Sélectionner "ProductName" comme "DisplayMember", puis cliquer sur "OK"
    • Cliquer sur le bouton "Create Grid", nommer-la "_orderDetailsDataGridView", puis cliquer sur "OK" (répondre "Oui" au message concernant l'aggrantissement nécessaire du formulaire)
    • Finalement, cliquer sur "OK" pour fermer la configuration du contrôle
    • Vous pouvez ensuite redimensionner et déplacer la grille générée, comme bon vous semble

  11. Ajouter le code suivant pour faire fonctionner la grille de détail des commandes :

    Modifier la région "Private fields" :

     
            #region Private Fields
            DomainModelEntityManager _manager = DomainModelEntityManager.DefaultManager;
            BindableList<Employee> _employees = new BindableList<Employee>();
            BindableList<Product> _products = new BindableList<Product>();
            BindableList<Order> _orders = new BindableList<Order>();
            BindableList<OrderDetail> _orderDetails = new BindableList<OrderDetail>();
            #endregion
     

    Modifier la fonction "ConfigureBindingSources()" :

     
            private void ConfigureBindingSources()
            {
                _employeesBindingSource.DataSource = _employees;
                _productsBindingSource.DataSource = _products; 
                _ordersBindingSource.DataSource = _orders;
                _orderDetailsBindingSource.DataSource = _orderDetails;
     
                _employeesBindingSource.ListChanged += new ListChangedEventHandler(_employeesBindingSource_ListChanged);
             }
     

    Modifier la fonction "ConfigureBindingManagers()" :

     
            private void ConfigureBindingManagers()
            {
                _employeesControlBindingManager.BindingSource = _employeesBindingSource;
                _ordersDataGridViewBindingManager.BindingSource = _ordersBindingSource;
                _orderDetailsDataGridViewBindingManager.BindingSource = _orderDetailsBindingSource;
            }
     

    Ajouter le propriété "CurrentOrder" dans la région "Public Properties" :

     
            public Order CurrentOrder
            {
                get
                {
                    if (_ordersBindingSource.Current == null)
                    {
                        return _manager.GetNullEntity<Order>();
                    }
                    return (_ordersBindingSource.Current as Order);
                }
            }
     

    Ajouter le fonction "_ordersBindingSource_CurrentChanged" sous la fonction "_employeesBindingSource_CurrentChanged" :

     
            void _ordersBindingSource_CurrentChanged(object sender, EventArgs e)
            {
                _orderDetails.ReplaceRange(CurrentOrder.OrderDetails);
            }
     

    Modifier la fonction "ConfigureHandlers()" :

     
            private void ConfigureHandlers()
            {
                _employeesBindingSource.CurrentChanged += new EventHandler(_employeesBindingSource_CurrentChanged);
                _ordersBindingSource.CurrentChanged += new EventHandler(_ordersBindingSource_CurrentChanged);
            }
     

    Et finalement, modifier la fonction "LoadData()" pour charger aussi les produits :

     
            private void LoadData()
            {
                _employees.ReplaceRange(_manager.Employees);
                _products.ReplaceRange(_manager.Products);
            }
     
  12. Ajout

    Adding a Record Using the New Item Row The .NET DataGrid requires three conditions to be met before displaying the New Item Row: (1) the AllowUserToAddRows property of the grid must be set to True; (2) the data source must implement IBindingList; and (3) the IBindingList.AllowNew property of the data source must be set to True. The AllowUserToAddRows property of the grid, as created by the DevForce DataGridViewBindingManager, is automatically set to True, so that base is covered. On the other hand, the IBindingList.AllowNew property is set to False on a ReadOnlyEntityList, so you must set that to True before the New Item Row will display in the grid.

    - documentation de DevForce



  13. Ajouter les fonctions "_ordersBindingSource_AddingNew" et "_orderDetailsBindingSource_AddingNew" :

     
            void _ordersBindingSource_AddingNew(object sender, AddingNewEventArgs e)
            {
                e.NewObject = Order.Create(_manager, CurrentEmployee);
            }
     
            void _orderDetailsBindingSource_AddingNew(object sender, AddingNewEventArgs e)
            {
                e.NewObject = OrderDetail.Create(_manager, CurrentOrder);
            }
     

    Modifier la fonction "ConfigureHandlers()" :

     
            private void ConfigureHandlers()
            {
                _employeesBindingSource.CurrentChanged += new EventHandler(_employeesBindingSource_CurrentChanged);
                _ordersBindingSource.CurrentChanged += new EventHandler(_ordersBindingSource_CurrentChanged);
     
                _ordersBindingSource.AddingNew += new AddingNewEventHandler(_ordersBindingSource_AddingNew);
                _orderDetailsBindingSource.AddingNew += new AddingNewEventHandler(_orderDetailsBindingSource_AddingNew);
            }
     

    Ajotuer la fonction de création d'une commande dans le fichier "Order.cs" (du projet "DomainModel") :

     
            #region Create Method
            public static Order Create(EntityManager manager, Employee employee)
            {
                Order anOrder = manager.CreateEntity<Order>();
                anOrder.Employee = employee;
                anOrder.EntityAspect.AddToManager();
                return anOrder;
            }
            #endregion Create Method
     

    Ajotuer la fonction de création d'une ligne de commande dans le fichier "OrderDetail.cs" (du projet "DomainModel") :

     
            #region Create Method
            public static OrderDetail Create(EntityManager manager, Order order)
            {
                OrderDetail anOrderDetail = manager.CreateEntity<OrderDetail>();
                anOrderDetail.Order = order;
                anOrderDetail.EntityAspect.AddToManager();
                return anOrderDetail;
            }
            #endregion Create Method
     
  14. Démarrer la solution et vérifier le bon fonctionnement des lignes d'ajout des grilles.

  15. Suppression avec la touche "Suppr" ("DEL")

    As discussed, a .NET BindingSource has an AddingNew event; unfortunately, it does not have a Deleting event. While it does have the equivalent of a Deleted event -- a ListChanged event whose ListChangedEventArgs parameter can be tested for a ListChangedType of ItemDeleted -- that doesn’t help. By the time that handler executes, the item has already been deleted from the list, so it’s too late to get any information about it that would permit us to find it in the PersistenceManager cache and mark it for deletion. Accordingly, we are forced to handle an event on the grid itself to manage deletes.

    - documentation de DevForce



  16. Ajouter les fonctions "_ordersDataGridView_UserDeletingRow" et "_orderDetailsDataGridView_UserDeletingRow" :

     
            //The business object’s Delete() method automatically causes it to be removed 
            //from any lists in which it participates. Because of that, after calling Delete() 
            //on the business object, we cancel the delete operation of the grid. If we didn’t,
            //that operation would remove an item from the list, too, resulting in two items 
            //disappearing from the grid.
            void _ordersDataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
            {
                var anOrder = (Order) e.Row.DataBoundItem;
                if (null != anOrder)
                {
                    anOrder.EntityAspect.Delete();
                    LoadData();
                }
                e.Cancel = true;
            }
     
            void _orderDetailsDataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
            {
                var anOrderDetail = (OrderDetail)e.Row.DataBoundItem;
                if (null != anOrderDetail)
                {
                    anOrderDetail.EntityAspect.Delete();
                    LoadData();
                }
                e.Cancel = true;
            }
     

    Modifier la fonction "ConfigureHandlers()" :

     
            private void ConfigureHandlers()
            {
                _employeesBindingSource.CurrentChanged += new EventHandler(_employeesBindingSource_CurrentChanged);
                _ordersBindingSource.CurrentChanged += new EventHandler(_ordersBindingSource_CurrentChanged);
     
                _ordersBindingSource.AddingNew += new AddingNewEventHandler(_ordersBindingSource_AddingNew);
                _orderDetailsBindingSource.AddingNew += new AddingNewEventHandler(_orderDetailsBindingSource_AddingNew);
                _ordersDataGridView.UserDeletingRow += new DataGridViewRowCancelEventHandler(_ordersDataGridView_UserDeletingRow);
                _orderDetailsDataGridView.UserDeletingRow += new DataGridViewRowCancelEventHandler(_orderDetailsDataGridView_UserDeletingRow);
     
            }
     

Solution finale

Disponible ici