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


Практическое руководство. Использование DataGrid в карманном ПК

Обновлен: Ноябрь 2007

В этом примере демонстрируются методики использования элемента управления DataGrid с формами для просмотра и изменения записи, выбранной в элементе управления DataGrid, и добавления новой записи в базу данных. Обратите внимание, что для изменения значений DataGrid должен присутствовать пользовательский интерфейс, поскольку изменение ячеек DataGrid в .NET Compact Framework не поддерживается. В этом примере используется база данных Northwind, устанавливаемая вместе с Visual Studio.

ms229684.alert_note(ru-ru,VS.90).gifПримечание.

Если применяется .NET Compact Framework версии 2.0, для использования элемента управления DataGrid необходимо добавить в проект ссылку на файл System.Windows.Forms.DataGrid.dll.

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

Кроме того, можно использовать Visual Studio для автоматического создания форм сводки и редактирования, выбрав Создать формы данных из контекстного меню смарт-тега в элементе управления DataGrid. Дополнительные сведения об этой возможности см. в разделе Практическое руководство. Создание сводки и представлений редактирования для приложений данных (устройства).

В данном приложении имеются формы, описанные в следующей таблице. Также приводятся параметры меню.

Форма

Функции

Параметры меню

Главная форма

(Form1)

Отображает элемент управления DataGrid.

Создать

Добавляет новую запись к базе данных и отображает форму EditView.

Правка

Отображает форму EditView.

SummaryView

Отображает оптимизированные для просмотра значения в столбцах текущей записи.

(отсутствует)

EditView

Отображает оптимизированные для редактирования значения в столбцах текущей записи.

Готово

Принимает данные в диалоговом окне, обновляет базу данных и отображает основную форму.

Отмена

Отменяет изменения в диалоговом окне и отображает основную форму.

Создание проекта и разработка главной формы

  1. В среде Visual Studio создайте проект для интеллектуальных устройств и задайте в качестве целевой платформы пакет SDK для карманных ПК Windows Mobile 5.0 или профессиональный пакет SDK Windows Mobile 6.

  2. В меню Данные выберите команду Добавить новый источник данных.

  3. Используйте Мастер настройки источника данных для подключения к базе данных Northwind с помощью сервера Microsoft SQL Server Compact Edition (поставщик данных платформы .NET Framework для SQL Server CE). База данных Northwind (Northwind.sdf) устанавливается в папку \Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples.

    ms229684.alert_note(ru-ru,VS.90).gifПримечание.

    В Windows Vista для доступа к базе данных Northwind необходимо запустить Visual Studio под учетной записью администратора. Дополнительные сведения о добавлении базы данных см. в разделе Практическое руководство. Добавление базы данных в проект устройства.

  4. На странице Выбор объектов базы данных мастера выберите таблицу Продукты и все ее столбцы.

  5. Добавьте в форму элемент управления DataGrid с панели элементов. Задайте его размер и расположение необходимым образом.

  6. Задайте в качестве значения свойства DataSource таблицу Продукты. Visual Studio добавит в проект объекты NorthwindDataSet, ProductsBindingSource и ProductsTableAdapter.

  7. Измените элемент управления DataGrid так, чтобы он отображал один или два столбца таблицы, добавив объект DataGridTableStyle к коллекции TableStyles. Щелкните свойство TableStyles в области Свойства. Это действие приводит к появлению диалогового окна Редактор коллекции DataGridTableStyle. Затем выполните следующие действия:

    1. Добавьте объект DataGridTableStyle к коллекции TableStyles.

    2. Для свойства MappingName укажите "Продукты".

    3. Щелкните свойство GridColumnStyle. Это действие приведет к появлению диалогового окна Редактор коллекции DataGridColumnStyle.

    4. Добавьте объект DataGridTextBoxColumn в коллекцию GridColumnStyles.

    5. Щелкните свойство MappingName и выберите Название продукта.

    6. Установите требуемые Текст заголовка и Ширину.

    7. Повторите эти действия для дополнительных столбцов.

    8. Закройте диалоговые окна.

  8. Добавьте две формы к проекту — одну для представления сводки и одну для представления редактирования. Задайте для них имена SummaryView и EditView.

  9. Добавьте параметр к конструкторам форм SummaryView и EditView, чтобы они могли принимать объект BindingSource. Объявите в этих формах глобальную переменную CurrentBindingSouce, которой будет присвоено значение объекта BindingSource, переданного в конструктор. Обратите внимание, что переменную нужно задавать перед вызовом метода InitializeComponent.

    Разработчики Visual Basic должны добавить в форму процедуру Sub New путем добавления метода Новый из списка Имя метода, расположенного в правой верхней части области кода.

    Dim CurrentBindingSource As BindingSource
    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        InitializeComponent()
    End Sub
    
    private BindingSource CurrentBindingSource;
    public SummaryView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
        InitializeComponent();
    }
    
  10. В основной форме добавьте объекты MenuItem с именами Создать(MenuItem1) и Правка (MenuItem2). Добавьте следующий код для событий Click пунктов меню Создать и Правка.

    ' Add new record.
    Private Sub MenuItem1_Click(ByVal sender As System.Object,_
      ByVal e As System.EventArgs) Handles MenuItem1.Click
        ProductsBindingSource.AllowNew = True
        ProductsBindingSource.AddNew()
    
        ' Pass the binding source to the form.
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            Me.ProductsTableAdapter.Update(Me.NorthwindDataSet)
        End If
    End Sub
    
    ' Edit record.
    Private Sub MenuItem2_Click(ByVal sender As System.Object,_
      ByVal e As System.EventArgs) Handles MenuItem2.Click
    
        ' Pass the binding source to the form.
        Dim EditViewDialog As New EditView(ProductsBindingSource)
        If EditViewDialog.ShowDialog() <> DialogResult.OK Then
            ProductsBindingSource.CancelEdit()
        Else
            ProductsBindingSource.EndEdit()
            Me.ProductsTableAdapter.Update(Me.NorthwindDataSet)
        End If
    End Sub
    
    // Add new record.
    private void menuItem1_Click(object sender, EventArgs e)
    {
        productsBindingSource.AllowNew = true;
        productsBindingSource.AddNew();
        EditView EditViewDialog = new EditView(productsBindingSource);
        if (EditViewDialog.ShowDialog() != DialogResult.OK)
        {
            productsBindingSource.CancelEdit();
        }
        else
        {
            ProductsBindingSource.EndEdit();
            this.productsTableAdapter.Update(this.northwindDataSet);
         }
    }
    // Edit record (Edit).
    private void menuItem2_Click(object sender, EventArgs e)
    {
        EditView EditViewDialog = new EditView(productsBindingSource);
        if (EditViewDialog.ShowDialog() != DialogResult.OK)
        {
            productsBindingSource.CancelEdit();
        }
        else
        {
            productsBindingSource.EndEdit();
            this.productsTableAdapter.Update(this.northwindDataSet);
        }
    }
    
  11. В главной форме добавьте код события KeyDown для элемента управления DataGrid, которое возникает при нажатии кнопки действия на карманном ПК. Это действие отображает форму SummaryView.

    ' Action button pressed.
    Private Sub DataGrid1_KeyDown(ByVal sender As System.Object, _
      ByVal e As System.Windows.Forms.KeyEventArgs) _
      Handles DataGrid1.KeyDown
        If (e.KeyCode = Keys.Enter) Then
            Dim SummaryViewDialog As New SummaryView(ProductsBindingSource)
            SummaryViewDialog.ShowDialog()
        End If
    End Sub
    
    // Action button pressed.
    private void dataGrid1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            SummaryView SummaryViewDialog = 
              new SummaryView(productsBindingSource);
            SummaryViewDialog.ShowDialog();
         }
    }
    

Создание представления сводки

  1. Добавьте в форму SummaryView следующие элементы управления:

    • Элемент управления Label для заголовка названия продукта, например, "Название продукта:".

    • Элемент управления Label для значения "Название продукта".

    • Элемент управления Label для значения снятия с производства, которое отображается в случае, если в столбце "Снят с производства" таблицы "Продукты" установлено значение true. В качестве текста подписи укажите "СНЯТ С ПРОИЗВОДСТВА", использовав шрифт красного цвета.

  2. Добавьте следующий код к конструктору формы SummaryView, чтобы задать привязки данных. Объявите переменную формы с именем CurrentBindingSource, которая будет задана переданному экземпляру объекта BindingSource, в конструкторе формы. Объект DataRowView определяет, что в случае, если для столбца "Снят с производства" задано значение true, будет отображаться подпись "Снят с производства".

    'Dim CurrentBindingSource As BindingSource
    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        ' This call is required by the Windows Forms Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        ' Bind the label that shows the product name.
        ProductNameLabelVal.DataBindings.Add("Text", _
          CurrentBindingSource, "Product Name")
    
            ' Show the Discontinued label if
            ' that value is true in the database.
            Dim drView As DataRowView
            drView = CurrentBindingSource.Current
            If drView.Item("Discontinued") = True Then
                DiscontinuedLabel.Visible = True
            Else
                DiscontinuedLabel.Visible = False
            End If
    End Sub
    
    private BindingSource CurrentBindingSource;
    public SummaryView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
        InitializeComponent();
        // Bind the label that shows the product name.
        ProductNameLabelVal.DataBindings.Add("Text",
          CurrentBindingSource, "Product Name");
        // Show the Discontinued label if
        // that value is true in the database.
        DataRowView drView;
        drView = (DataRowView) CurrentBindingSource.Current;
        if (drView["Discontinued"] == true)
        {
            DiscontinuedLabel.Visible = true;
        }
        else
        {
            DiscontinuedLabel.Visible = false;
        }
    }
    

Создание представления редактирования

  1. Добавьте в проект ссылку на пространство имен Microsoft.WindowsCE.Forms.

  2. Перетащите компонент InputPanel из панели элементов в форму EditView. Чтобы предоставить пользователю возможность ввода текста в текстовое поле при помощи программной панели ввода (SIP), необходим только один экземпляр.

  3. Добавьте в форму следующие элементы управления:

    • Элемент управления Label для текстового поля "Название продукта".

    • Элемент управления TextBox для столбца "Название продукта".

    • Элемент управления CheckBox для столбца "Снят с производства". Установите для свойства ThreeState этого элемента управления значение true.

  4. Чтобы задать привязки данных, добавьте в конструктор формы следующий код после вызова InitializeComponent. Этот код обеспечивает добавление новой или изменение существующей записи. Если добавляется новая запись, объект DataRowView определяет, имеет ли столбец "Снят с производства" пустое значение, и присваивает свойству NullValue привязки значение поля Indeterminate свойства CheckState.

    Public Sub New(ByVal bsource As BindingSource)
        CurrentBindingSource = bsource
        InitializeComponent()
        ' Add the bindings.
        ProductNameTextBox.DataBindings.Add("Text",_
      CurrentBindingSource, "Product Name")
        Dim drView As DataRowView
        drView = CurrentBindingSource.Current
        If IsDBNull(drView("Discontinued")) Then
            DiscontinuedCheckBox.DataBindings.Add("CheckState",_
              CurrentBindingSource, "Discontinued", True,_
              DataSourceUpdateMode.OnValidation, _
              CheckState.Indeterminate)
        Else
            DiscontinuedCheckBox.DataBindings.Add("Checked",_
             CurrentBindingSource, "Discontinued")
        End If
    End Sub
    
    public EditView(BindingSource bsource)
    {
        CurrentBindingSource = bsource;
         InitializeComponent();
         CurrentBindingSource = bsource;
         InitializeComponent();
         //  Add the bindings.
         productNameTextBox.DataBindings.Add("Text",
           CurrentBindingSource, "Product Name");
         DataRowView drView;
         drView = (DataRowView) CurrentBindingSource.Current;
         if (drView("Discontinued") == null)
         {
             DiscontinuedCheckBox.DataBindings.Add("CheckState",
               CurrentBindingSource, "Discontinued", true,
               DataSourceUpdateMode.OnValidation,
               CheckState.Indeterminate);
         }
         else
         {
              DiscontinuedCheckBox.DataBindings.Add("Checked",
                CurrentBindingSource, "Discontinued");
         }
    }
    
  5. Добавьте объект MenuItem с текстом Готово, чтобы иметь возможность обновить базу данных и вернуться к главной форме.

    ' Done
    Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
        Me.DialogResult = DialogResult.OK
        Me.Close()
    End Sub
    // Done
    private void menuItem1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.OK;
        this.Close();
    }
    
  6. Добавьте объект MenuItem с названием Отменана том же уровне, что и Готово, чтобы иметь возможность отменить изменения и вернуться к главной форме.

    ' Cancel
    Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
        Me.DialogResult = DialogResult.Cancel
        Me.Close()
    End Sub
    
    // Cancel
    private void menuItem1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Cancel;
        this.Close();
    }
    

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

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

См. также

Задачи

Практическое руководство. Использование DataGrid в смартфоне

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

Создание объектов DataSet со строгой типизацией (ADO.NET)

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

Поддержка доступа к данным и XML в .NET Compact Framework