Практическое руководство. Использование DataGrid в карманном ПК
Обновлен: Ноябрь 2007
В этом примере демонстрируются методики использования элемента управления DataGrid с формами для просмотра и изменения записи, выбранной в элементе управления DataGrid, и добавления новой записи в базу данных. Обратите внимание, что для изменения значений DataGrid должен присутствовать пользовательский интерфейс, поскольку изменение ячеек DataGrid в .NET Compact Framework не поддерживается. В этом примере используется база данных Northwind, устанавливаемая вместе с Visual Studio.
Примечание. |
---|
Если применяется .NET Compact Framework версии 2.0, для использования элемента управления DataGrid необходимо добавить в проект ссылку на файл System.Windows.Forms.DataGrid.dll. |
Объект BindingSource предоставляет доступ к выбранной в настоящее время записи в базе данных, которая передается конструкторам форм сводки и изменения, чтобы все формы могли использовать один и тот же источник привязки. Помимо элементов управления с привязкой к данным объект BindingSource может вернуть объект DataRowView, соответствующий текущей строке. Объект DataRowView можно использовать для обращения к данным в различных целях — например, для определения текущего значения столбца. Обратите внимание, что в целях демонстрации в этом примере используются только два столбца для форм сводки и редактирования.
Кроме того, можно использовать Visual Studio для автоматического создания форм сводки и редактирования, выбрав Создать формы данных из контекстного меню смарт-тега в элементе управления DataGrid. Дополнительные сведения об этой возможности см. в разделе Практическое руководство. Создание сводки и представлений редактирования для приложений данных (устройства).
В данном приложении имеются формы, описанные в следующей таблице. Также приводятся параметры меню.
Форма |
Функции |
Параметры меню |
---|---|---|
Главная форма (Form1) |
Отображает элемент управления DataGrid. |
Создать Добавляет новую запись к базе данных и отображает форму EditView. Правка Отображает форму EditView. |
SummaryView |
Отображает оптимизированные для просмотра значения в столбцах текущей записи. |
(отсутствует) |
EditView |
Отображает оптимизированные для редактирования значения в столбцах текущей записи. |
Готово Принимает данные в диалоговом окне, обновляет базу данных и отображает основную форму. Отмена Отменяет изменения в диалоговом окне и отображает основную форму. |
Создание проекта и разработка главной формы
В среде Visual Studio создайте проект для интеллектуальных устройств и задайте в качестве целевой платформы пакет SDK для карманных ПК Windows Mobile 5.0 или профессиональный пакет SDK Windows Mobile 6.
В меню Данные выберите команду Добавить новый источник данных.
Используйте Мастер настройки источника данных для подключения к базе данных Northwind с помощью сервера Microsoft SQL Server Compact Edition (поставщик данных платформы .NET Framework для SQL Server CE). База данных Northwind (Northwind.sdf) устанавливается в папку \Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples.
Примечание. В Windows Vista для доступа к базе данных Northwind необходимо запустить Visual Studio под учетной записью администратора. Дополнительные сведения о добавлении базы данных см. в разделе Практическое руководство. Добавление базы данных в проект устройства.
На странице Выбор объектов базы данных мастера выберите таблицу Продукты и все ее столбцы.
Добавьте в форму элемент управления DataGrid с панели элементов. Задайте его размер и расположение необходимым образом.
Задайте в качестве значения свойства DataSource таблицу Продукты. Visual Studio добавит в проект объекты NorthwindDataSet, ProductsBindingSource и ProductsTableAdapter.
Измените элемент управления DataGrid так, чтобы он отображал один или два столбца таблицы, добавив объект DataGridTableStyle к коллекции TableStyles. Щелкните свойство TableStyles в области Свойства. Это действие приводит к появлению диалогового окна Редактор коллекции DataGridTableStyle. Затем выполните следующие действия:
Добавьте объект DataGridTableStyle к коллекции TableStyles.
Для свойства MappingName укажите "Продукты".
Щелкните свойство GridColumnStyle. Это действие приведет к появлению диалогового окна Редактор коллекции DataGridColumnStyle.
Добавьте объект DataGridTextBoxColumn в коллекцию GridColumnStyles.
Щелкните свойство MappingName и выберите Название продукта.
Установите требуемые Текст заголовка и Ширину.
Повторите эти действия для дополнительных столбцов.
Закройте диалоговые окна.
Добавьте две формы к проекту — одну для представления сводки и одну для представления редактирования. Задайте для них имена SummaryView и EditView.
Добавьте параметр к конструкторам форм 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(); }
В основной форме добавьте объекты 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); } }
В главной форме добавьте код события 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(); } }
Создание представления сводки
Добавьте в форму SummaryView следующие элементы управления:
Элемент управления Label для заголовка названия продукта, например, "Название продукта:".
Элемент управления Label для значения "Название продукта".
Элемент управления Label для значения снятия с производства, которое отображается в случае, если в столбце "Снят с производства" таблицы "Продукты" установлено значение true. В качестве текста подписи укажите "СНЯТ С ПРОИЗВОДСТВА", использовав шрифт красного цвета.
Добавьте следующий код к конструктору формы 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; } }
Создание представления редактирования
Добавьте в проект ссылку на пространство имен Microsoft.WindowsCE.Forms.
Перетащите компонент InputPanel из панели элементов в форму EditView. Чтобы предоставить пользователю возможность ввода текста в текстовое поле при помощи программной панели ввода (SIP), необходим только один экземпляр.
Добавьте в форму следующие элементы управления:
Элемент управления Label для текстового поля "Название продукта".
Элемент управления TextBox для столбца "Название продукта".
Элемент управления CheckBox для столбца "Снят с производства". Установите для свойства ThreeState этого элемента управления значение true.
Чтобы задать привязки данных, добавьте в конструктор формы следующий код после вызова 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"); } }
Добавьте объект 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(); }
Добавьте объект 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)