Практическое руководство. Настройка дополнений к элементам с помощью элемента управления BindingSource в Windows Forms

При использовании компонента BindingSource для привязки элемента управления Windows Forms к источнику данных может потребоваться настроить создание новых элементов. Компонент BindingSource упрощает эту процедуру, предоставляя событие AddingNew , которое обычно происходит, когда связанный элемент управления должен создать новый элемент. Обработчик событий может обеспечивать любое необходимое поведение (например, вызов метода веб-службы или получение нового объекта из фабрики класса).

Примечание.

Добавление элемента с помощью события AddingNew отменить нельзя.

Пример

В примере ниже показано, как связать элемент управления DataGridView с фабрикой класса с помощью компонента BindingSource . Когда пользователь щелкает новую строку элемента управления DataGridView , вызывается событие AddingNew . Обработчик событий создает объект DemoCustomer , который присваивается свойству AddingNewEventArgs.NewObject . В результате новый объект DemoCustomer добавляется к списку компонентов BindingSource и отображается в новой строке элемента управления DataGridView .

#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);
}
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;
        }
    }
}
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

Компиляция кода

Для этого примера требуются:

  • ссылки на сборки System, System.Data, System.Drawing и System.Windows.Forms.

См. также