Коррекция пользовательского интерфейса — КиберПедия 

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

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Коррекция пользовательского интерфейса

2022-09-11 23
Коррекция пользовательского интерфейса 0.00 из 5.00 0 оценок
Заказать работу

Проверка на наличие текста в окне выпадающего списка (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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.012 с.