Опубликован: 05.08.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 6:

Редактирование данных OLE DB средствами ADO.NET

  • Добавьте к проекту WinForms2 новый пустой файл (шаблон Code File) с именем CreateInterface.cs и заполните его кодом динамического создания интерфейса пользователя
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
namespace WinForms2
{
    partial class Form1
    {
        // Динамическое создание элементов первой вкладки
        void CreatePage1()
        {
            TabPage page = new TabPage("Строки");
            tabControl.TabPages.Add(page);// Добавили вкладку к панели
    
            // Табличная панель для вертикального выравнивания элементов
            TableLayoutPanel tableLayoutPanel = new TableLayoutPanel();
            page.Controls.Add(tableLayoutPanel);// Добавили табличную панель к вкладке
            tableLayoutPanel.Dock = DockStyle.Fill;
            // Рисуем рамку вокруг панели (для красоты)
            tableLayoutPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
    
            // Панель горизонтального выравнивания
            // верхней ячейки табличной панели
            FlowLayoutPanel flowLayoutPanel = new FlowLayoutPanel();
            flowLayoutPanel.Dock = DockStyle.Top;
            flowLayoutPanel.AutoSize = true;
            tableLayoutPanel.Controls.Add(flowLayoutPanel);
    
            // Заполняем горизонтальную панель
            // Для наглядности группируем в блоки кода
            {
                // Create ComboBox
                flowLayoutPanel.Controls.Add(cbLetters = new ComboBox());// Создаем и добавляем
                cbLetters.Anchor = AnchorStyles.None;// Выравнивание по центру родителя
                cbLetters.Width = 80;// Зададим ширину
                cbLetters.KeyDown += new KeyEventHandler(cbLetters_KeyDown);// Не редактировать
                cbLetters.KeyPress += new KeyPressEventHandler(cbLetters_KeyPress);// Не редактировать
                cbLetters.SelectedIndexChanged += cbLetters_SelectedIndexChanged;// Выбрать
                cbLetters.BindingContextChanged += cbLetters_SelectedIndexChanged;// Для начальной загрузки
                // Всплывающая подсказка
                ToolTip toolTip = new ToolTip();
                String message = "Фильтр записей таблицы";
                toolTip.SetToolTip(cbLetters, message);
                toolTip.IsBalloon = true;
                //toolTip.ToolTipIcon = ToolTipIcon.Info;
                //toolTip.ForeColor = Color.Magenta;
                //toolTip.BackColor = Color.LightGoldenrodYellow;
            }
            {
                // Create Button
                flowLayoutPanel.Controls.Add(button = new Button());// Создаем и добавляем
                button.Anchor = AnchorStyles.None;// Выравнивание по центру родителя
                button.Text = "Delete";
                button.AutoSize = true;
                // Регистрируем обработчик события Click
                button.Click += button_DeleteClick;
                // Всплывающая подсказка
                ToolTip toolTip = new ToolTip();
                String message = "Удаление текущей записи";
                toolTip.SetToolTip(button, message);
                toolTip.IsBalloon = true;
    
                // Create Button
                button = new Button();
                button.Parent = flowLayoutPanel; // Добавляем к табличной панели
                button.Anchor = AnchorStyles.None;// Выравнивание по центру родителя
                button.Text = "Restore";
                button.AutoSize = true;
                // Регистрируем обработчик события Click
                button.Click += button_RestoreClick;
                // Всплывающая подсказка
                toolTip = new ToolTip();
                message = "Восстановление\nнесохраненных\nизменений";
                toolTip.SetToolTip(button, message);
                toolTip.IsBalloon = true;
    
                // Create Button
                button = new Button();
                button.Parent = flowLayoutPanel; // Добавляем к табличной панели
                button.Anchor = AnchorStyles.None;// Выравнивание по центру родителя
                button.Text = "Update";
                button.AutoSize = true;
                // Регистрируем обработчик события Click
                button.Click += button_UpdateClick;
                // Всплывающая подсказка
                toolTip = new ToolTip();
                message = "Запись в БД";
                toolTip.SetToolTip(button, message);
                toolTip.IsBalloon = true;
            }
    
            // Список размещаем под горизонтальной панелью
            tableLayoutPanel.Controls.Add(listBox = new ListBox());
            listBox.Dock = DockStyle.Fill;
            listBox.Margin = new Padding(0);// Убираем отступы вокруг списка
            tableLayoutPanel.Padding = new Padding(0);// Убираем отступы внутри панели
        }
    
        void cbLetters_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }
    
        void cbLetters_KeyDown(object sender, KeyEventArgs e)
        {
            e.Handled = true;
        }
    
        // Динамическое создание элементов второй вкладки
        void CreatePage2()
        {
            TabPage page = new TabPage("Поля");
            tabControl.TabPages.Add(page);// Добавили вкладку к панели 
            TableLayoutPanel tablePanel = new TableLayoutPanel();// Табличная панель
            tablePanel.Parent = page;// Назначили родителя
            tablePanel.Dock = DockStyle.Fill;// На всю вкладку
            FlowLayoutPanel flowPanel = new FlowLayoutPanel();// Горизонтальная панель
            flowPanel.Parent = tablePanel;// Назначили родителя
            flowPanel.Dock = DockStyle.Top;// Пристыковали вверх к родителю
            flowPanel.AutoSize = true;// По размеру содержимого
            flowPanel.BorderStyle = BorderStyle.Fixed3D;// Красиво тесненная
            TableLayoutPanel tmp = new TableLayoutPanel();
            tmp.Parent = tablePanel;
            tmp.Dock = DockStyle.Fill;
            tablePanel = tmp;// Бросили внешнюю панель
            tmp = null;
            //tablePanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;// Рамка
    
            // Заполняем верхнюю панель
            Button button = new Button();
            button.Text = "Current";
            button.AutoSize = true;
            button.Parent = flowPanel;
            button.Click += button_CurrentClick;
            // Всплывающая подсказка
            ToolTip toolTip = new ToolTip();
            String message = "Заполнение полей\nзначениями текущей записи";
            toolTip.SetToolTip(button, message);
            toolTip.IsBalloon = true;
    
            button = new Button();
            button.Text = "NewRow";
            button.AutoSize = true;
            button.Parent = flowPanel;
            button.Click += button_NewRowClick;
            // Всплывающая подсказка
            toolTip = new ToolTip();
            message = "Создание новой записи";
            toolTip.SetToolTip(button, message);
            toolTip.IsBalloon = true;
    
            // Используем ту же ссылку для создания другой кнопки
            button = new Button();
            button.Text = "AddRow";
            button.AutoSize = true;
            button.Parent = flowPanel;
            button.Click += button_AddRowClick;
            // Всплывающая подсказка
            toolTip = new ToolTip();
            message = "Сохранение новой\nзаписи в таблице";
            toolTip.SetToolTip(button, message);
            toolTip.IsBalloon = true;
    
            button = new Button();
            button.Text = "Clear";
            button.AutoSize = true;
            button.Parent = flowPanel;
            button.Click += button_ClearClick;
            // Всплывающая подсказка
            toolTip = new ToolTip();
            message = "Очистить поля/Отменить запись";
            toolTip.SetToolTip(button, message);
            toolTip.IsBalloon = true;
    
            Label label = new Label();
            label.Text = "Поля для редактирования записи:";
            label.AutoSize = true;
            label.Parent = tablePanel;
    
            CreateTextBox(tablePanel);
    
            // Собираем ссылки на все TextBox формы, так как 
            // на форме нет других TextBox, ненужных нам!!!
            FindTextBox(this.Controls);
        }
    
        // Динамически добавляем поля во вторую вкладку
        void CreateTextBox(TableLayoutPanel panel)
        {
            String[] columnName = { 
                                      "CustomerID", 
                                      "CompanyName",
                                      "Address",
                                      "City",
                                      "Phone"
                                  };
    
            for (int i = 0; i < columnName.Length; i++)
            {
                FlowLayoutPanel flowPanel = new FlowLayoutPanel();
                flowPanel.Dock = DockStyle.Top;
                flowPanel.AutoSize = true;
                flowPanel.Parent = panel;
                Label label = new Label();
                label.AutoSize = true;
                label.Text = columnName[i] + ":";
                label.Anchor = AnchorStyles.None;// Выравнивание по центру горизонтали
                label.Parent = flowPanel;
                TextBox txtBox = new TextBox();
                txtBox.Name = columnName[i];
                txtBox.Width = 200;
                txtBox.Parent = flowPanel;
            }
        }
    
        // Рекурсивный поиск всех объектов TextBox
        // в дереве коллекций, начиная от текущего корня
        // System.Collections.ArrayList list = 
        // new System.Collections.ArrayList(); - можно и этот, только он 
        // работает с типом Object и нужно будет явно повышать полномочия ссылки
        List<TextBox> listReference = new List<TextBox>();// Типизированный список
        void FindTextBox(Control.ControlCollection controls)
        {
            foreach (Control ctrl in controls)
            {
                if (ctrl is TextBox)
                {
                    listReference.Add((TextBox)ctrl);
                }
    
                if (ctrl.Controls != null)
                {
                    FindTextBox(ctrl.Controls);// Рекурсия!!!
                }
            }
        }
    }
}
  • Запустите проект и проверьте заложенную в нем функциональность

Два снимка экрана, иллюстрирующие интерфейс приложения, выглядят так



Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000