Partager via


Comment : personnaliser l'ajout d'éléments avec le composant BindingSource Windows Forms

Mise à jour : novembre 2007

Lorsque vous utilisez un composant BindingSource pour lier un contrôle Windows Forms à une source de données, il peut s'avérer nécessaire de personnaliser la création de nouveaux éléments. Le composant BindingSource facilite cette personnalisation en fournissant l'événement AddingNew, déclenché en général lorsque le contrôle lié doit créer un nouvel élément. Votre gestionnaire d'événements peut fournir tout comportement personnalisé requis (par exemple, appeler une méthode sur un service Web ou obtenir un nouvel objet à partir d'une fabrique de classe).

Remarque :

Lorsqu'un élément est ajouté via l'événement AddingNew, cet ajout ne peut pas être annulé.

Exemple

L'exemple suivant montre comment lier un contrôle DataGridView à une fabrique de classe en utilisant un composant BindingSource. Lorsque l'utilisateur clique sur la nouvelle ligne du contrôle DataGridView, l'événement AddingNew est déclenché. Le gestionnaire d'événements crée un nouvel objet DemoCustomer, assigné à la propriété AddingNewEventArgs.NewObject. Cela entraîne l'ajout du nouvel objet DemoCustomer à la liste du composant BindingSource et son affichage sur la nouvelle ligne du contrôle DataGridView.

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Data.SqlClient
Imports System.Windows.Forms

' This form demonstrates using a BindingSource to provide
' data from a collection of custom types to a DataGridView control.
Public Class Form1
    Inherits System.Windows.Forms.Form

    ' This is the BindingSource that will provide data for
   ' the DataGridView control.
    Private WithEvents customersBindingSource As New BindingSource()

   ' This is the DataGridView control that will display our data.
   Private customersDataGridView As New DataGridView()

   ' Set up the StatusBar for displaying ListChanged events.
   Private status As New StatusBar()

    Public Sub New()

        ' Set up the form.
        Me.Size = New Size(800, 800)
        AddHandler Me.Load, AddressOf Form1_Load
        Me.Controls.Add(status)

        ' Set up the DataGridView control.
        Me.customersDataGridView.Dock = DockStyle.Fill
        Me.Controls.Add(customersDataGridView)

    End Sub

    Private Sub Form1_Load( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs)

        ' Add a DemoCustomer to cause a row to be displayed.
        Me.customersBindingSource.AddNew()

        ' Bind the BindingSource to the DataGridView 
        ' control's DataSource.
        Me.customersDataGridView.DataSource = Me.customersBindingSource

    End Sub

   ' This event handler provides custom item-creation behavior.
    Private Sub customersBindingSource_AddingNew( _
    ByVal sender As Object, _
    ByVal e As AddingNewEventArgs) _
    Handles customersBindingSource.AddingNew

        e.NewObject = DemoCustomer.CreateNewCustomer()

    End Sub

    ' This event handler detects changes in the BindingSource 
   ' list or changes to items within the list.
    Private Sub customersBindingSource_ListChanged( _
    ByVal sender As Object, _
    ByVal e As ListChangedEventArgs) _
    Handles customersBindingSource.ListChanged

        status.Text = e.ListChangedType.ToString()

    End Sub

   <STAThread()>  _
   Shared Sub Main()
      Application.EnableVisualStyles()
      Application.Run(New Form1())
    End Sub
End Class

' This class implements a simple customer type.
Public Class DemoCustomer

    ' These fields hold the values for the public properties.
    Private idValue As Guid = Guid.NewGuid()
    Private customerName As String = String.Empty
    Private companyNameValue As String = String.Empty
    Private phoneNumberValue As String = String.Empty

    ' The constructor is private to enforce the factory pattern.
    Private Sub New()
        customerName = "no data"
        companyNameValue = "no data"
        phoneNumberValue = "no data"
    End Sub

    ' This is the public factory method.
    Public Shared Function CreateNewCustomer() As DemoCustomer
        Return New DemoCustomer()
    End Function

    ' This property represents an ID, suitable
    ' for use as a primary key in a database.
    Public ReadOnly Property ID() As Guid
        Get
            Return Me.idValue
        End Get
    End Property

    Public Property CompanyName() As String
        Get
            Return Me.companyNameValue
        End Get

        Set(ByVal value As String)
            Me.companyNameValue = Value
        End Set
    End Property

    Public Property PhoneNumber() As String
        Get
            Return Me.phoneNumberValue
        End Get

        Set(ByVal value As String)
            Me.phoneNumberValue = Value
        End Set
    End Property
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Data.SqlClient;
using System.Windows.Forms;

// This form demonstrates using a BindingSource to provide
// data from a collection of custom types to a DataGridView control.
public class Form1 : System.Windows.Forms.Form
{
    // This is the BindingSource that will provide data for
    // the DataGridView control.
    private BindingSource customersBindingSource = new BindingSource();

    // This is the DataGridView control that will display our data.
    private DataGridView customersDataGridView = new DataGridView();

    // Set up the StatusBar for displaying ListChanged events.
    private StatusBar status = new StatusBar();


    public Form1()
    {
        // Set up the form.
        this.Size = new Size(800, 800);
        this.Load += new EventHandler(Form1_Load);
        this.Controls.Add(status);

        // Set up the DataGridView control.
        this.customersDataGridView.Dock = DockStyle.Fill;
        this.Controls.Add(customersDataGridView);

        // Attach an event handler for the AddingNew event.
        this.customersBindingSource.AddingNew += 
            new AddingNewEventHandler(customersBindingSource_AddingNew);

        // Attach an event handler for the ListChanged event.
        this.customersBindingSource.ListChanged += 
            new ListChangedEventHandler(customersBindingSource_ListChanged);
    }

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Add a DemoCustomer to cause a row to be displayed.
        this.customersBindingSource.AddNew();

        // Bind the BindingSource to the DataGridView 
        // control's DataSource.
        this.customersDataGridView.DataSource = 
            this.customersBindingSource;
    }

    // This event handler provides custom item-creation behavior.
    void customersBindingSource_AddingNew(
        object sender, 
        AddingNewEventArgs e)
    {
        e.NewObject = DemoCustomer.CreateNewCustomer();
    }

    // This event handler detects changes in the BindingSource 
    // list or changes to items within the list.
    void customersBindingSource_ListChanged(
        object sender, 
        ListChangedEventArgs e)
    {
        status.Text = e.ListChangedType.ToString();
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }
}

// This class implements a simple customer type.
public class DemoCustomer
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerName = String.Empty;
    private string companyNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerName = "no data";
        companyNameValue = "no data";
        phoneNumberValue = "no data";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CompanyName
    {
        get
        {
            return this.companyNameValue;
        }

        set
        {
            this.companyNameValue = value;
        }
    }

    public string PhoneNumber
    {
        get
        {
            return this.phoneNumberValue;
        }

        set
        {
            this.phoneNumberValue = value;
        }
    }
}
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::ComponentModel;
using namespace System::Drawing;
using namespace System::Globalization;
using namespace System::Windows::Forms;

namespace DataConnectorAddingNewExample
{
    // This class implements a simple customer type.
    public ref class DemoCustomer
    {
    private:
        // These fields hold the values for the public properties.
        Guid idValue;
        String^ customerName;
        String^ companyNameValue;
        String^ phoneNumberValue;

        // The constructor is private to enforce the factory pattern.
        DemoCustomer()
        {
            idValue = Guid::NewGuid();
            customerName = String::Empty;
            companyNameValue = String::Empty;
            phoneNumberValue = String::Empty;
            customerName = "no data";
            companyNameValue = "no data";
            phoneNumberValue = "no data";
        }

    public:
        // This is the public factory method.
        static DemoCustomer^ CreateNewCustomer()
        {
            return gcnew DemoCustomer;
        }

        property Guid ID 
        {
            // This property represents an ID, suitable
            // for use as a primary key in a database.
            Guid get()
            {
                return this->idValue;
            }
        }

        property String^ CompanyName 
        {
            String^ get()
            {
                return this->companyNameValue;
            }

            void set(String^ value)
            {
                this->companyNameValue = value;
            }
        }

        property String^ PhoneNumber 
        {
            String^ get()
            {
                return this->phoneNumberValue;
            }

            void set(String^ value)
            {
                this->phoneNumberValue = value;
            }
        }
    };

    // This form demonstrates using a BindingSource to provide
    // data from a collection of custom types 
    // to a DataGridView control.
    public ref class MainForm: public System::Windows::Forms::Form
    {
    private:

        // This is the BindingSource that will provide data for
        // the DataGridView control.
        BindingSource^ customersBindingSource;

        // This is the DataGridView control 
        // that will display our data.
        DataGridView^ customersDataGridView;

        // Set up the StatusBar for displaying ListChanged events.
        StatusBar^ status;
    
    public:

        MainForm()
        {
            customersBindingSource = gcnew BindingSource;
            customersDataGridView = gcnew DataGridView;
            status = gcnew StatusBar;

            // Set up the form.
            this->Size = System::Drawing::Size(600, 400);
            this->Text = "BindingSource.AddingNew sample";
            this->Load += 
                gcnew EventHandler(this, &MainForm::OnMainFormLoad);
            this->Controls->Add(status);

            // Set up the DataGridView control.
            this->customersDataGridView->Dock = DockStyle::Fill;
            this->Controls->Add(this->customersDataGridView);

            // Attach an event handler for the AddingNew event.
            this->customersBindingSource->AddingNew += 
                gcnew AddingNewEventHandler(this, 
                &MainForm::OnCustomersBindingSourceAddingNew);

            // Attach an event handler for the ListChanged event.
            this->customersBindingSource->ListChanged += 
                gcnew ListChangedEventHandler(this, 
                &MainForm::OnCustomersBindingSourceListChanged);
        }

    private:

        void OnMainFormLoad(Object^ sender, EventArgs^ e)
        {
            // Add a DemoCustomer to cause a row to be displayed.
            this->customersBindingSource->AddNew();

            // Bind the BindingSource to the DataGridView 
            // control's DataSource.
            this->customersDataGridView->DataSource = 
                this->customersBindingSource;
        }

        // This event handler provides custom item-creation behavior.
        void OnCustomersBindingSourceAddingNew(Object^ sender, 
            AddingNewEventArgs^ e)
        {
            e->NewObject = DemoCustomer::CreateNewCustomer();
        }

        // This event handler detects changes in the BindingSource 
        // list or changes to items within the list.
        void OnCustomersBindingSourceListChanged(Object^ sender, 
            ListChangedEventArgs^ e)
        {   
            status->Text = Convert::ToString(e->ListChangedType, 
                CultureInfo::CurrentCulture);
        }
    };
}

[STAThread]
int main()
{
    Application::EnableVisualStyles();
    Application::Run(gcnew DataConnectorAddingNewExample::MainForm);
}

Compilation du code

Cet exemple nécessite les actions ou les éléments suivants :

  • Références aux assemblys System, System.Data, System.Drawing et System.Windows.Forms.

Pour plus d'informations sur la génération de cet exemple à partir de la ligne de commande pour Visual Basic ou Visual C#, consultez Génération à partir de la ligne de commande (Visual Basic) ou Génération à partir de la ligne de commande avec csc.exe. Vous pouvez aussi générer cet exemple dans Visual Studio en collant le code dans un nouveau projet.

Voir aussi

Tâches

Comment : lier un contrôle Windows Forms à un type

Référence

BindingNavigator

DataGridView

BindingSource

Autres ressources

Composant BindingSource