Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2022-09-11 | 24 |
5.00
из
|
Заказать работу |
|
|
Проверка на наличие текста в окне выпадающего списка (what == "") важна, так как в ее отсутствии метод Select выдает странный результат (убедитесь в этом самостоятельно). Но эту проверкку можно убрать, если вовремя скорректировать пользовательский интерфейс. Если текст в окне comboFind не выбран (или не набран), то сама команда поиска должна быть недоступной (disabled). Покажем, как можно добиться такого поведения.
· Первый вариант. Обычным образом создать обработчик события TextUpdate для списка comboFind и вызвать в нем вспомогптельный метод (назовем его UpdateFindPanel), который должен управлять доступностью кнопки btnFindList (свойство Enabled), а также видимостью панели поиска (свойство Panel1Collapsed элемента типа SplitContainer).
· Второй вариант делает то же самое, но с помощью лямбда-выражения (это выглядит значительно изящнее).
comboFind.TextUpdate += (s, a) => UpdateFindPanel();
· Добавьте эту строку кода в нужное место (вычислите момент жизни приложения, когда следует это сделать). Метод UpdateFindPanel должен установить свойства кнопок и панели, как было указано ранее.
void UpdateFindPanel()
{
bool enabled = // Логическое выражение: Текст comboFind (освобожденный от white space) не пуст.
btnFindNext.Enabled = btnFindList.Enabled = btnFindView.Enabled = enabled;
split.Panel1Collapsed =!enabled;
}
· Добавьте обработчик события SelectedIndexChanged для выпадающего списка comboFind (в виде лямбда-выражения) и выполните в нем вызов метода UpdateFindPanel.
Теперь блок кода if (what == "") в методе Find можно убрать. Если добавить вызов UpdateFindPanel() в конструктор формы (или в обработчик события Load, то автоматически произойдет начальная установка свойства Enabled для всех кнопок.
Результат поиска
Напомним, что поиск производился в DataTable (в памяти), а его результат надо отобразить в DataGridView (на экране). Если поиск (вызов метода Select класса DataTable) был удачным, то показать результат можно путем маркировки в DataGridView той его ячейки, которая соответствует первой (rows[0]) строке из массива (rows) всех строк, найденных в DataTable. Это делается с помощью свойства CurrentCell компонента DataGridView. Заметим, что установка этого свойства провоцирует событие CellEnter — входа фокуса в ячейку DataGridView. Ячейка grid выделяется цветом, управляемым свойством SelectionBackColor класса DataGridViewCellStyle. Доступ к объекту DataGridViewCellStyle дает свойство DefaultCellStyle класса DataGridView.
|
Чтобы все прошло гладко, нам осталось вычислить целочисленный индекс той строки в DataGridView, которая соответствует первому элементу в массиве строк, найденных в DataTable. Простое действие — определение индекса, казалось бы не должно вызвать затруднений. Но именно оно вынуждает напряженно искать решение.
Дело в том, что результатом отбора (метода Select) является массив ссылок на объекты класса DataRow, содержащиеся во внутренней коллекции объекта DataTable. Порядок элементов в этом массиве никак не связан с порядком отображения строк таблицы в DataGridView.
Вы заметили, что отображаемые строки можно сортировать самыми разными способами, если последовательно нажимать мышью заголовки всех столбцов элемента DataGridView? Эта внешняя сортировка никак не влияет на то значение, которое дает выражение rows[0][0]. Оно всего лишь выбирает значение, расположенное в нулевом столбце той строки DataTable, индекс которой записан в элементе rows[0]. Нулевой столбец соответствует полю ID и мы узнаем ключ первой из найденных записей. Если строки DataGridView в данный момент отсортированы по этому столбцу, то результат поиска будет показан (маркирован) правильно, если по другому — нет.
В процессе отбора строк из DataTable не учитывается факт внешней сортировки, так как эта структура расположена в памяти и не сортируется при нажатии на заголовки DataGridView. Напомним, что компонент DataGridView лишь отображает объекты.
Поиск в DataGridView
Анализ поведения приложения в режиме поиска, наводит на мысль о том, что целесообразно производить поиск не в таблице, поддерживаемой классом DataTable, а непосредственно в компоненте DataGridView. Хотелось бы сделать поиск более удобным.
|
· Продолжать поиск со строки, следующей за той, которая в данный момент содержит фокус.
· Зациклить процедуру поиска так, чтобы при прохождении всего списка можно было повторить ее сначала. Желательно сделать это без назойливого напоминания о том, что очередной цикл поиска закончился.
· Пользователь должен иметь возможность искать в любой колонке как gridStud, так и gridExam.
· Измените алгоритм метода Find.
void Find()
{
string colName = // Определите имя колонки (используйте индексы: searchTableID и searchColumnID
try
{
string text = Trim(comboFind.Text); // Искомый текст
if (findWhat!= text)
findWhat = text;
if (bFindNext)
searchRowID++;
if (searchRowID < 0 || grids[searchTableID].Rows.Count <= searchRowID)
searchRowID = 0;
if (FindNext())
{
if (!comboFind.Items.Contains(comboFind.Text))
comboFind.Items.Add(comboFind.Text);
bFindNext = true;
return;
}
else
throw new Exception();
}
catch { }
SetErrorMsg(findWhat, colName);
}
· Доверьте IntelliSense создание заготовки метода SetErrorMsg, затем введите код, как показано ниже.
void SetErrorMsg(string criteria, string colName)
{
string msg = "Could not find: '" + criteria + "'";
msg += colName!= null? " in column: " + colName: ". Select a column to search";
new FormMsg(msg, 2000);
}
· Добавьте метод FindNext.
bool FindNext()
{
bool bFound = false;
DataGridView grid = grids[searchTableID];
for (int i = searchRowID; findWhat.Length > 0 &&!bFound;) // Цикл поиска
{
object o = grid[searchColumnID, i].Value; // ячейка в строке i и столбце searchColumnID
if (o!= null)
{
string val = o.ToString();
if (Если текст в ячейке начинается с искомой строки)
{
bFound = true;
grid.CurrentCell = grid[searchColumnID, i];
// Выделите всю строку grid
// Запомните индекс строки в переменной searchRowID
break;
}
}
if (i == grid.RowCount - 1)
i = -1;
i++;
if (i == searchRowID)
break;
}
return bFound;
}
Проверка показывает удовлетворительное поведение приложения в режиме поиска, но здесь, конечно, остались подводные камни. Чтобы увидеть их, надо связать DataGridView с реальной таблицей базы данных, которая может содержать тысячи строк.
|
|
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!