Поделиться через


Пример. Проверка данных элемента управления DataGridView в Windows Forms

При отображении функциональных возможностей ввода данных на экране для пользователя введенные в форму данные можно, как правило, проверить. С помощью класса DataGridView можно легко проверить данные, прежде чем они будут записаны в хранилище данных. Для проверки данных можно обработать событие CellValidating, вызываемое DataGridView при изменении текущей ячейки.

В этом пошаговом руководстве будут извлечены строки из таблицы Customers в примере базы данных "Northwind", которые затем будут выведены в элементе управления DataGridView. Когда пользователь изменяет ячейку в столбце CompanyName и пытается выйти из нее, обработчик событий CellValidating проверяет новую строку наименования компании на наличие данных в ней; если значение в строке отсутствует, DataGridView, не позволяет курсору перемещаться их ячейки до тех пор, пока значение в ячейке не будет указано.

Чтобы скопировать весь текст кода из этой темы, см. раздел Практическое руководство. Проверка данных элемента управления DataGridView в Windows Forms.

Обязательные компоненты

Для выполнения этого пошагового руководства потребуется следующее.

  • Доступ к серверу с примером базы данных SQL Server под именем "Northwind".

Создание формы

Проверка данных, введенных в элемент управления DataGridView

  1. Создайте производный от Form класс, который содержит элемент управления DataGridView и компонент BindingSource.

    В следующем примере кода представлена базовая реализация и включен метод Main.

    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        Private WithEvents dataGridView1 As New DataGridView()
        Private bindingSource1 As New BindingSource()
    
        Public Sub New()
    
            ' Initialize the form.
            Me.dataGridView1.Dock = DockStyle.Fill
            Me.Controls.Add(dataGridView1)
            Me.Text = "DataGridView validation demo (disallows empty CompanyName)"
    
        End Sub
    
    
    ...
    
    
        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub
    
    End Class
    
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    
    public class Form1 : System.Windows.Forms.Form
    {
        private DataGridView dataGridView1 = new DataGridView();
        private BindingSource bindingSource1 = new BindingSource();
    
        public Form1()
        {
            // Initialize the form.
            this.dataGridView1.Dock = DockStyle.Fill;
            this.Controls.Add(dataGridView1);
            this.Load += new EventHandler(Form1_Load);
            this.Text = "DataGridView validation demo (disallows empty CompanyName)";
        }
    
    
    ...
    
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    
    }
    
  2. Реализуйте метод в определении класса формы для обработки подробных сведений для подключения к базе данных.

    В этом примере кода используется метод GetData , возвращающий заполненный объект DataTable. Переменной connectionString следует присвоить значение, подходящее для базы данных.

    Примечание о безопасностиПримечание по безопасности

    Хранение в строке подключения конфиденциальных сведений, таких как пароль, может привести к снижению уровня защиты приложения.Использование проверки подлинности Windows (также называемой встроенными средствами безопасности) — более безопасный способ управления доступом к базе данных.Дополнительные сведения см. в разделе Защита сведений о соединении (ADO.NET).

    Private Shared Function GetData(ByVal selectCommand As String) As DataTable
    
        Dim connectionString As String = _
            "Integrated Security=SSPI;Persist Security Info=False;" + _
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096"
    
        ' Connect to the database and fill a data table.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
    
        Return data
    
    End Function
    
    private static DataTable GetData(string selectCommand)
    {
        string connectionString =
            "Integrated Security=SSPI;Persist Security Info=False;" +
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096";
    
        // Connect to the database and fill a data table.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
    
        return data;
    }
    
  3. Реализуйте обработчик для события Load формы, инициализирующий DataGridView и BindingSource и устанавливающий привязку данных.

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    
        ' Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers")
        Me.dataGridView1.DataSource = bindingSource1
        Me.dataGridView1.AutoResizeColumns( _
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
    
    End Sub
    
    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Attach DataGridView events to the corresponding event handlers.
        this.dataGridView1.CellValidating += new
            DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
        this.dataGridView1.CellEndEdit += new
            DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
    
        // Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers");
        this.dataGridView1.DataSource = bindingSource1;
        this.dataGridView1.AutoResizeColumns(
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }
    
  4. Реализуйте обработчики для событий CellValidating и CellEndEdit элемента управления DataGridView.

    В обработчике событий CellValidating определяется, будет ли значение ячейки в столбце CompanyName пустым. Если ячейка не проходит проверку, свойству Cancel класса System.Windows.Forms.DataGridViewCellValidatingEventArgs необходимо присвоить значение true. В этом случае элемент управления DataGridView заставит курсор остаться в ячейке. Свойству ErrorText в строке присвойте пояснительную строку. В этом случае на экране появится значок ошибки с ToolTip с текстом ошибки. В обработчике событий CellEndEdit свойству ErrorText строки присвойте пустую строку. Событие CellEndEdit происходит только при выходе ячейки из режима редактирования, и если ячейка не проходит проверку, режим редактирования не отключается.

    Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles dataGridView1.CellValidating
    
        Dim headerText As String = _
            dataGridView1.Columns(e.ColumnIndex).HeaderText
    
        ' Abort validation if cell is not in the CompanyName column.
        If Not headerText.Equals("CompanyName") Then Return
    
        ' Confirm that the cell is not empty.
        If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
            dataGridView1.Rows(e.RowIndex).ErrorText = _
                "Company Name must not be empty"
            e.Cancel = True
        End If
    End Sub
    
    Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
        Handles dataGridView1.CellEndEdit
    
        ' Clear the row error in case the user presses ESC.   
        dataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
    
    End Sub
    
    private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        string headerText = 
            dataGridView1.Columns[e.ColumnIndex].HeaderText;
    
        // Abort validation if cell is not in the CompanyName column.
        if (!headerText.Equals("CompanyName")) return;
    
        // Confirm that the cell is not empty.
        if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
        {
            dataGridView1.Rows[e.RowIndex].ErrorText =
                "Company Name must not be empty";
            e.Cancel = true;
        }
    }
    
    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        // Clear the row error in case the user presses ESC.   
        dataGridView1.Rows[e.RowIndex].ErrorText = String.Empty;
    }
    

Тестирование приложения

Теперь можно проверить форму, чтобы убедиться, что она работает так, как ожидалось.

Чтобы проверить форму, выполните следующие действия:

  • Скомпилируйте и запустите приложение.

    Появится элемент управления DataGridView с данными из таблицы Customers. Если дважды щелкнуть ячейку в столбце CompanyName, значение можно будет изменить. Если удалить все символы и нажать клавишу TAB для выхода из ячейки, DataGridView не позволит выйти из нее. Если в ячейку ввести непустое строковое значение, элемент управления DataGridView позволит выйти из ячейки.

Следующие действия

Это приложение позволяет в общем понять возможности элемента управления DataGridView. Внешний вид и поведение элемента управления DataGridView можно контролировать несколькими способами.

См. также

Задачи

Практическое руководство. Проверка данных элемента управления DataGridView в Windows Forms

Пример. Обработка ошибок, связанных с вводом данных с помощью элемента управления DataGridView, в Windows Forms

Ссылки

DataGridView

BindingSource

Основные понятия

Защита сведений о соединении (ADO.NET)

Другие ресурсы

Ввод данных с помощью элемента управления DataGridView в Windows Forms