Дополнительные средства навигации и редактирования



Мы поможем в написании ваших работ!


Мы поможем в написании ваших работ!



Мы поможем в написании ваших работ!


ЗНАЕТЕ ЛИ ВЫ?

Дополнительные средства навигации и редактирования



Для таблицы с набором данных

 

Компонент BindingNavigator является специализированной панелью инструментов, на которую уже добавлены стандартные кнопки для управления набором данных. Вполне допустимо дополнять эту панель новыми кнопками и даже удалять из нее те стандартные кнопки, которые не требуются для разрабатываемого приложения. Кроме того, можно изменять поведение стандартных кнопок.

 

Добавьте на форму Form1 компонент типа BindingNavigator (он получит имя bindingNavigator1 и будет размещен в области невизуальных компонентов под изображением формы, кроме того, в верхней части формы появится панель инструментов, связанная с этим компонентом).

Для компонента bindingNavigator1 установите:

свойство Dock = Bottom( в результате панель переместиться в нижнюю часть формы);

свойство BindingSource = bindingSource1

 

Для компонента bindingNavigator1необходимо также выполнить команду SendtoBack (нажав на кнопку … на панели Layoutили воспользовавшись контекстным меню данного компонента). Это необходимо для того, чтобы панель инструментов не заслоняла нижнюю часть таблицы dataGridView1. В результате форма Form1 примет вид:

 

Теперь с помощью элементов управления, размещенных на панели bindingNavigator1, можно быстро перемещаться по таблице, добавлять новые строки и удалять существующие.

Если текущей является строка NewRow, то действие по удалению выполняется не вполне естественным образом: удаляется строка, предшествующая строке NewRow. Кроме того, при попытке удалить единственную строку NewRow в пустом наборе данных возникает ошибка времени выполнения.

Для исправления указанного недочета определите обработчик события RowEnter для таблицы dataGridView1:

 

private void dataGridView1_RowEnter(object sender,

DataGridViewCellEventArgs e)

{

bindingNavigatorDeleteItem.Enabled =

!dataGridView1.Rows[e.RowIndex].IsNewRow;

}

 

 

 

Автоматизация действий при добавлении нового элемента данных

 

Настройте свойства первого столбца таблицы dataGridView1 следующим образом:

dataGridView1.Colums.id1: ReadOnly = True,

DefaultCellSty;e.ForeColor = GrayText,

DefaultCellStyle.SelectionForeColor = GrayText

 

Дополните метод dataGridView1_CurrentCellDirtyStateChanged (приведен новый вариант метода) :

 

privatevoid dataGridView1_CurrentCellDirtyStateChanged(object sender,

EventArgs e)

{

menuStrip1.Enabled = !dataGridView1.IsCurrentCellDirty;

int row = dataGridView1.CurrentRow.Index;

if (!dataGridView1.IsCurrentCellDirty &&

(int)dataGridView1["Id1", row].Value == 0)

{

int maxId = 0;

for (int i = 0; i< row; i++)

{

int v = (int)dataGridView1["Id1", i].Value;

if (maxId< v)

maxId = v;

}

dataGridView1["Id1", row].Value = maxId_1;

}

}

 

Теперь при добавлении нового элемента данных в его свойство Id, отображаемое в первом столбце таблицы с заголовком №, автоматически заносится номер, который на 1 больше максимального из уже имеющихся номеров в загруженном наборе данных.

 

Сортировка данных

Используя конструктор меню, создайте в компоненте menuStrip1 новый пункт меню первого уровня с текстом &Data и с помощью окна Properties измените имя этого пункта (т.е. свойство Name) наdate1. В выпадающем меню, связанном с пунктом Data, создайте пункт с текстом &Sortby…и измените имя этого пункта на sortby1. Затем перейдите в заготовку меню третьего уровня, связанную с пунктом Sortby…, добавьте в нее три пункта меню с текстом &Id, &Surname, &Course+Group и измените имена этих пунктов на id2, surname2, course2соответственно.

 

 

В конструктор класса Form1 добавьте новые операторы:

id2.Tag = 0;

surname2.Tag = 1;

course2.Tag = 2;

 

В описание класса Form1 добавьте три вспомогательных метода: CompareById, CompareBySurname, CompareByCourse:

 

private int CompareById(student a, student b)

{

return a.Id - b.Id;

}

 

private int CompareBySurname(student a, student b)

{

return a.Surname.CompareTo(b.Surname);

}

 

private int CompareByCourse(student a, student b)

{

int res = a.Course - b.Course;

if (res == 0)

res = a.Group - b.Group;

if (res == 0)

res = a.Surname.CompareTo(b.Surname);

return res;

}

 

Определите обработчик события Click для пункта меню id2:

 

private void id2_Click(object sender, EventArgs e)

{

if (dataGridView1.RowCount == 1)

return;

dataGridView1.CurrentCell = dataGridView1[0, 0];

Comparison<student> comp = CompareById;

switch ((int)(sender asToolStripMenuItem).Tag)

{

case 1:

comp = CompareBySurname;

break;

case 2:

comp = CompareByCourse;

break;

 

}

(bindingSource1.DataSource asList<student>).Sort(comp);

bindingSource1.ResetBindings(false);

}

 

Свяжите созданный обработчик с событием Click пунктов меню surname2, course2.

 

 

 

 

Поиск по шаблону

 

Поиск организуется с помощью одного из перегруженных вариантов метода FindIndex обобщенного класса List<T>, а именно – варианта с двумя параметрами: номера элемента, с которого начинается поиск, и тестовой функции. Тестовая функция должна иметь один параметр типа T и возвращать логическое значение true, если ее параметр удовлетворяет критерию поиска, и false в противном случае. Параметр метода FindIndex, соответствующий тестовой функции, описывается в виде делегата-обобщения Predicate<T>.

Для организации поиска подключите к проекту библиотеку Microsoft.VisualBasic. Для этого щелкните правой кнопкой мыши на строке References в окне SolutionExplorer, выберите в появившемся контекстом меню команду AddReference. Выделите пункт Microsoft.VisualBasic, после чего нажмите кнопку OK.

 

 

В начало файла Form1.cs добавьте оператор

 

using Microsoft.VisualBasic;

 

В описание класса Form1 добавьте новое поле:

 

private string surnameToFind = "";

 

Дополните выпадающее меню, связанное с пунктом Data, добавив в него пункт с текстом &Find…, и измените имя добавленного пункта меню на find1.

Измените первый оператор метода dataGridView1_RowEnter (приведен полный вариант дополненного метода с выделенными дополнениями)

 

private void dataGridView1_RowEnter(object sender,

DataGridViewCellEventArgs e)

{

Find.Enabled = bindingNavigatorDeleteItem.Enabled =

!dataGridView1.Rows[e.RowIndex].IsNewRow;

}

 

Аналогичным образом измените первый оператор метода dataGridView1_CurrentCellDirtyStateChanged (добавьте Find.Enabled)

 

 

Определите обработчик события Click для пункта меню find1

 

private void find1_Click(object sender, EventArgs e)

{

surnameToFind =

Interaction.InputBox("Введите начальную часть фамилии для поиска:",

"Поиск по фамилии", surnameToFind, -1, -1).Trim();

if (surnameToFind == "")

return;

int ind = (bindingSource1.DataSource as

List<student>).FindIndex(dataGridView1.CurrentRow.Index,

delegate(student a)

{

return a.Surname.StartsWith(surnameToFind,

StringComparison.OrdinalIgnoreCase);

});

if (ind != -1)

dataGridView1.CurrentCell = dataGridView1[1, ind];

else

MessageBox.Show("Фамилия не найдена", "Поиск по фамилии");

}

 

В результате добавленная в меню команда Find позволяет организовать поиск студента по начальной части его фамилии. Для ввода требуемой начальной фамилии используется стандартное диалоговое окно. При отображении этого окна в нем выводится предыдущий текст для поиска. В случае, если введенный текст является пустым или содержит только пробелы, а также если диалоговое окно закрывается нажатием кнопки Cancel или клавиши <Esc>, действие команды Find отменяется, а текст для поиска полагается равным пустой строке.

 

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

Если текущей является последняя строка таблицы (NewRow), то команда Find недоступна.

 

 

 

 

Приложение 1. Оформление титульного листа

 



Последнее изменение этой страницы: 2016-04-23; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.215.79.116 (0.012 с.)