Компоненты pfsgrid net таблица с множеством поддерживаемых функций


Содержание

Компоненты pfsgrid net таблица с множеством поддерживаемых функций

StringGrid — компонент для отображения различных данных в табличной форме. Как следует из названия, ячейки компонента StringGrid Delphi могут содержать данные, имеющие тип String, а также отображать графику.

Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows — зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает одно из значений свойства Options.

Итак, компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i — номер столбца, j — номер строки, имеет вид

и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0.

Выделенная ячейка таблицы имеет

номер столбца: StringGrid1.Col
номер строки: StringGrid1.Row

поэтому содержимое выделенной ячейки будет адресоваться так:

Не правда ли, написание такой строки — утомительный процесс. Поэтому пользуйтесь оператором присоединения with:

with StringGrid1 do
S:=Cells[Col, Row];

А лучше сразу задать в свойстве Name имя покороче, например SG.

За многие свойства компонента Delphi StringGrid отвечает свойство Options. В Инспекторе Объектов Options — это раскрывающийся список, представляющий собой элементы данного множества. Если значение элемента равно True, то он присутствует в множестве, если False — то нет.

Свойство Значение
goFixedVertLine Наличие вертикальных разделительных линий между «фиксированными» ячейками
goFixedHorzLine Наличие горизонтальных разделительных линий между «фиксированными» ячейками
goVertLine Наличие вертикальных разделительных линий между «обычными» ячейками
goHorzLine Наличие горизонтальных разделительных линий между «обычными» ячейками
goRangeSelect Возможность выделить диапазон ячеек
goDrawFocusSelected Закрашивание ячейки с фокусом ввода
goRowSizing Возможность менять высоту строк мышкой
goColSizing Возможность менять ширину столбцов мышкой
goRowMoving Возможность менять номер строки, то есть перемещать её, мышкой
goColMoving Возможность менять номер столбца, то есть перемещать его, мышкой
goEditing Возможность редактировать содержимое ячейки с клавиатуры
goTabs При значении True фокус смещается на следующую ячейку в таблице, False — на следующий компонент
goRowSelect Выделяется вся строка с «фокусированной» ячейкой
goAlwaysShowEditor При значении True содержимое ячейки при получении фокуса сразу доступно редактированию, False — сначала необходимо щёлкнуть по ней мышкой, либо нажать Enter или F2
(прим.: не действует при goRowSelect=True)
goThumbTracking При значении True перемещение «бегунка» прокрутки мышкой вызывает немедленное перемещение ячеек, False — ячейки перемещаются только при отпускании «бегунка»

Как следует из таблицы, за возможность редактировать содержимое ячеек с клавиатуры отвечает элемент goEditing свойства-множества Options. В Инспекторе Объектов установите его значение в True. Чтобы управлять этой возможностью программно, нужно включить или исключить из множества данный элемент:

Если элементы заданы списком, это аналогично присвоению в Инспекторе Объектов этим элементам значения True, остальным — False.

Ячеек в таблице, как правило, много, и в рамках компонента видна только часть из них. В программе доступна информация как об общем количестве строк и столбцов, так и номерах и количестве строк и столбцов, видимых в рамках таблицы.

Количество строк в Delphi StringGrid равно StringGrid1.RowCount.
Количество столбцов в Delphi StringGrid равно StringGrid1.ColCount.

Если ячейки не помещаются в таблице, появляются полосы прокрутки. При прокручивании

StringGrid1.LeftCol Номер столбца, видимого самым левым
StringGrid1.TopRow Номер строки, видимой самой верхней
StringGrid1.VisibleColCount Количество столбцов, видимых в рамках таблицы
StringGrid1.VisibleRowCount Количество строк, видимых в рамках таблицы

У таблицы StringGrid также есть свойство и для управления размером ячеек.Для всех ячеек

DefaultRowHeight — высота строк по умолчанию
DefaultColWidth — ширина столбцов по умолчанию

Эти значения ширины и высоты принимают все новые ячейки. При необходимости индивидуально установить ширину и высоту столбцов и строк соответственно, пользуемся свойствами

RowHeights — массив, содержащий высоты строк. То есть, например, RowHeights[5] — высота строки с индексом 5
ColWidths — массив, содержащий ширины столбцов. То есть, например, ColWidths[5] — ширина строки с номером 5

Все эти свойства настраиваем в обработчике события OnCreate Формы, так же как и надписи заголовков, располагающиеся в строках и столбцах «фиксированной» зоны таблицы. В результате таблица появляется уже в «настроенном» виде!

Поскольку ячейки компонента StringGrid можно редактировать, точно так же как и строку ввода Edit, то возникает вопрос, можно ли программно установить курсор в заданную позицию в содержимом ячейки? Оказывается, есть такая возможность. Для этого требуются дополнительный тип данных на основе таблицы и вспомогательная процедура:

type TGr >
procedure SetCaretPosition(Grid: TStringGrid; col, row, x_pos: Integer);
begin
Gr > Gr > with TGridCracker(Grid) do
InplaceEditor.SelStart := x_pos;
end;

Теперь можно установить желаемую позицию курсора в ячейке, например, по нажатию кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.SetFocus;
with StringGrid1 do
SetCaretPosition(StringGrid1, Col, Row, 2);
end;

Правда, ещё один момент! Чтобы код сработал, нужно установить в Инспекторе Объектов значение параметра goAlwaysShoweEditor свойства Options в True. Можно это сделать также и программно, в той же процедуре нажатия кнопки:

Отдельно требуется осветить вопрос очистки содержимого таблицы StringGrid. Так как таблица StringGrid, в отличие от, например, компонента Memo, не имеет метода для очистки содержимого сразу всех ячеек, то для удаления внесённых в таблицу ранее данных приходится очищать каждую ячейку отдельно. Делается это двумя вложенными циклами for, пробегающими по столбцам и строкам:

var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки строк не трогаем
for j:=1 to ColCount-1 do //Заголовки столбцов не трогаем
Cells[j, i]:=»;
end;

Хотя, оказывается, есть метод для очищения содержимого целого столбца или строки:

StringGrid1.Cols[i].Clear; //Очищается столбец с номером i
StringGrid1.Rows[i].Clear; //Очищается строка с номером i

Очевидно, очищение этими методами гораздо быстрее. Однако будут очищены и ячейки фиксированной зоны, содержащие, например, названия строк и столбцов, которые удалять не нужно. Их после очистки нужно просто «написать» заново, на глаз эта манипуляция совершенно незаметна. Для очистки всей таблицы достаточно последовательно очистить только строки или только столбцы:

var i, j: Integer;
begin
with StringGRid1 do
for i:=1 to RowCount-1 do //Заголовки столбцов не трогаем — цикл от 1
begin
Rows[i].Clear;
Cells[0, i]:=»Заголовок строки i»;
end;
end;

Казалось бы, можно поступить и по-другому, просто обнулить количество строк или столбцов! Однако так делать неправильно, так как при их последующем добавлении может оказаться, что каждая ячейка содержит прежние данные. А в Delphi4 даже при уменьшении количества строк или столбцов содержавшиеся в них данные вообще не пропадали, а так и повисали в воздухе! Так что так можно поступать только если в добавляемых ячейках сразу будет новое непустое содержимое.

Как узнать координаты ячейки при щелчке мышкой

Методы таблицы позволяют получить индексы ячейки, по которой производится щелчок мышкой. Индексы ячейки бывают необходимы, например, при использовании контекстного меню таблицы. Когда меню появляется при щелчке правой кнопкой мышки по таблице, во первых, нужно перенести фокус в эту ячейку(сам он туда не пойдёт, проверьте!), и во вторых, обработчику нужно получить содержимое ячейки, а тут без координат данной ячейки не обойтись.

Возможность получить координаты ячейки доступна в обработчиках событий OnMouseDown и OnMouseUp. Параметры этих событий содержат пиксельные координаты щелчка. Более естественно использовать OnMouseDown, так как это событие наступает раньше. Получив координаты в пикселах, их нужно пересчитать в индексы ячейки. Этим занимается метод таблицы StringGrid — MouseToCell:

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var ACol, ARow: Integer;
begin
StringGr >//Получаем индексы ячейки ACol и ARow
//Перемещаем фокус в ячейку с этими индексами:
StringGr > StringGr > end;

Графические возможности компонента StringGrid

Таблица StringGrid Delphi обладает также и графическими возможностями. Ячейки таблицы можно раскрашивать в произвольные цвета, выводить рисунки, размещать не только однострочный, но и многострочный текст. Графические возможности StringGrid определяются наличием у таблицы свойства Canvas — холста, на котором можно воспроизводить любую графику стандартными методами Delphi. Кроме того, компонент StringGrid имеет дополнительные методы, помогающие выводу графики в ячейки компонента. читать далее.

Совместная работа StringGrid и Excel

Очень многие документы создаются и хранятся в формате электронных таблиц Microsoft Excel. Несмотря на то, что эти таблицы обладают возможностями для автоматической обработки документа, нам, дельфистам, гораздо приятнее работать в привычной среде, что которая и обладает к тому же гораздо более развитыми возможностями. Давайте посмотрим, как получать данные из Excel. Естественно, табличные данные будем размещать в привычную нам таблицу StringGrid. А уж в ней мы горы своротим!

учимся
программировать

Программированию нельзя научить, можно только научится

Главная » Уроки по ООП » Урок 42. Компоненты TDBGrid, TDBCtrlGrid

Урок 42. Компоненты TDBGrid, TDBCtrlGrid

Компонент TDBGrid

TDBGrid — таблица, в которой строки представляют собой записи, а столбцы — поля набора данных. Свойство DataSource содержит ссылку на выбранный набор данных.

Столбцы DBGrid

Столбцы – поля подключенного набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Требуемый набор полей можно составить при помощи специального Редактора столбцов (рис. 1), который открывается при двойном щелчке на компоненте, перенесенном на форму.
В верхней части окна вы видите четыре кнопки, слева — направо:

  1. Add New (Добавить новый столбец).
  2. Delete Selected (Удалить выделенный столбец).
  3. Add All Fields (Добавить все столбцы из набора данных).
  4. Restore Defaults (Восстановить значения по умолчанию для выделенного столбца).

Рис. 1. Редактор колонок компонента TDBGrid
Для выбранного в списке столбца доступные для редактирования свойства появляются в Инспекторе объектов. Столбцы в списке можно редактировать, удалять, менять местами.
Изменить параметры заголовка столбца можно в раскрывающемся свойстве Title, которое имеет ряд собственных свойств:
Alignment — свойство устанавливает выравнивание заголовка и может быть taCenter (по центру), taLeftJustify (по левому краю) и taRightJustify (по правому краю).
Caption — свойство содержит текст, который отображается в заголовке столбца.
Color — цвет заголовка.
Font — шрифт заголовка.
Свойства Font, Alignment и Color внутри свойства Title меняют шрифт, выравнивание и цвет фона только заголовка столбца, а не его содержимого. Но у столбца имеются эти же свойства, они меняют шрифт, выравнивание и цвет фона выводимых в столбце данных.
Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину.

Задание 1. Работа с редактором полей компонента DBGrid
1. Установите на форму компонент ADOTable, свяжите его с таблицей Pers базы Сотрудники (свойства ConnectionString – связать с базой Сотрудники, TableName=Pers, Active=True).
2. Установите DataSource, свяжите его с ADOTable1. .
3. На форму добавьте и компонент DBGrid, который свяжите с DataSource1..
4. Нам нужны не все поля таблицы, а только некоторые из них. Дважды щелкните по компоненту DBGrid1 и в открывшемся редакторе столбцов нажмите кнопку Add New. Появится один пустой столбец. Для того, чтобы он показал данные нужного поля, выделите его и в инспекторе объектов в свойстве FieldName выберите поле Fam. .
5. Найдите свойство Title, раскройте его нажатием на кнопку «+». Настройте подсвойство Alignment=taCenter, Caption=”Фамилия”, Font установите полужирным. Найдите свойство Width, установите его равным 150. .
6.Аналогично добавьте и настройте свойства полей Nam, Par, Sex, Dep.
.
Рисунок 2. Форма к заданию 1.

Пустые столбцы

Если добавить в редактор столбцов сетки DBGrid новый столбец, но в свойстве FieldName не выбирать поле БД, а оставить его пустым, мы получим пустой столбец. Для чего нужны пустые столбцы в сетке? В них можно выводить обработанные данные из других столбцов.

Задание 2. К примеру, пользователю неудобно просматривать три столбца «Фамилия», «Имя» и «Отчество» из таблицы Pers базы данных Сотрудники. Ему было бы удобней просмотреть один сборный столбец в формате «Фамилия И.О.». .
1. Это и все последующие задания выполнять в программе из задания 1..
2. Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите «Фамилия И.О.», а в свойстве Width укажите ширину в 200 пикселей. .
3. Столбцы «Фамилия», «Имя» и «Отчество» нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0..
4. Для компонента DBGrid1 создайте обработчик события OnDrawColumnCell. Это событие наступает при прорисовке каждой ячейки столбца. В него внесите код:.

var s: String;
begin
if Column.Index = 0 then //если это пустой столбец
begin
if ADOTable1[‘Fam’]<>Null then s:=ADOTable1[‘Fam’] + ‘ ‘;
if ADOTable1[‘Nam’]<>Null then s:=s + Copy(ADOTable1[‘Nam’], 1, 1)+ ‘.’;
if ADOTable1[‘Par’] <>Null then s:=s + Copy(ADOTable1[‘Par’], 1, 1) + ‘.’;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end;
end;

Здесь мы вначале проверяем — наш ли это столбец (равен ли индекс нулю)? Если наш, то в переменную s начинаем собирать нужный текст. При этом имеем в виду, что пользователь мог и не заполнить некоторые поля. Чтобы у нас не произошло ошибки, вначале убеждаемся, что поле не равно Null (то есть, текст есть). Если текст есть, добавляем его в переменную s. Причем если это имя или отчество, с помощью функции Copy() получаем только первую букву и добавляем к ней точку. Когда s сформирована, добавляем этот текст в наш столбец с помощью метода TextOut() свойства Canvas сетки. В метод передаются три параметра: координаты левой позиции, верхней позиции и сам текст. Эти координаты мы берем из параметра события OnDrawColumnCellRect, который имеет такие свойства, как Left и Top, показывающие, соответственно, левую и верхнюю позиции текущей ячейки.
В результате программа будет иметь вид:

Рисунок 3. Заполнение пустого столбца

Задание 3. Использовать пустой столбец для вывода информации по требованию пользователя. В DBGrid нам нужна кнопка, нажатие на которую привело бы к выводу сообщения об отделе, в котором работает сотрудник.
1. Откройте редактор столбцов и удалите столбец Dep.
2. Создайте новый пустой столбец. Перетаскивать его не нужно, пусть будет последним. Свойство Width (ширина) установите в 20 пикселей. Название столбца (Title.Caption) пусть будет пустым. В свойстве ButtonStyle выберите значение cbsEllipsis. Это приведет к тому, что при попытке редактировать этот столбец образуется кнопка с тремя точками:

Рисунок 4. Кнопка в пустом столбце
3. Создайте обработчик события OnEditButtonClick() компонента DBGrid. Это событие происходит всякий раз, когда пользователь нажимает на кнопку «…».

4. Теперь, когда пользователь нажмет на эту кнопку, ему будет выведено сообщение с текстом об отделе, в котором работает сотрудник.

Список выбора в столбце — PickList

DBGrid позволяет устроить список, аналогичный ComboBox в одном из своих столбцов без использования каких-либо других компонентов.

Задание 4. Создать для поля «Sex» список выбора значений (муж, жен).
1. Откройте редактор столбцов сетки и выделите столбец «Sex». Обратите внимание на свойство PickList в Инспекторе объектов. Это свойство имеет тип TStrings, то есть представляет собой набор строк. Щелкните дважды по PickList, чтобы открыть редактор, и впишите туда
муж
жен
именно так, каждое значение на своей строке.
2. Запустите программу и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:

Рисунок 5. Список выбора в сетке

Наличие такого списка не препятствует пользователю ввести какое-то иное значение. Этот список нужен не для контроля, а только для облегчения пользователю ввода данных. Если же вы не желаете, чтобы пользователь имел возможность вводить другие данные, контроль следует организовать иным способом.

В практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто: DBGrid1.Columns.Items[4].PickList.Add(‘абв’);

Список свойства PickList автоматически заполняется для поля синхронного просмотра (lookup-поле).

Выделение отдельных строк

Очень часто в практике приходится выделять какие-то строки, изменяя их фон или цвет шрифта. Например, в бухгалтерии обычно выделяют строки, в которых значение меньше нуля. Допустим, ваша программа показывает клиентов, а какой-то столбец содержит их баланс на счету вашей компании. Если этот баланс меньше 0, значит, клиент имеет задолженность перед вашей фирмой. Бухгалтеру будет очень удобно, если дебиторы (должники) будут выделяться в общем списке красным цветом.

Способ прорисовки данных в DBGrid зависит от значения его свойства DefaultDrawing. По умолчанию свойство равно True, то есть данные прорисовываются автоматически. Если свойство содержит False, то прорисовку придется кодировать самостоятельно в свойстве OnDrawColumnCell.
Если мы написали алгоритм прорисовки, но свойство DefaultDrawing содержит True, то вначале сетка заполнится данными автоматически, а затем будет выполнен наш алгоритм. Другими словами, прорисовка некоторых частей сетки будет выполнена дважды. Это не очень хорошо для быстродействия программы, однако нам придется поступать именно так: ведь мы не все строки и столбцы собираемся выводить другим способом, а только некоторые. Остальные будут заполнены данными по умолчанию.

Разберем этот метод подробней. Если найти его в справке Delphi, то увидим:

property OnDrawColumnCell: TDrawColumnCellEvent;

То есть, этот метод имеет тип TDrawColumnCellEvent. Описание типа такое:

type TDrawColumnCellEvent = procedure (Sender:TObject; const Rect:TRect;
DataCol:Integer; Column:TColumn; State:TGridDrawState) of object;

Разберемся с параметрами.
Rect — координаты прорисовки.
DataCol — порядковый номер текущего столбца (начиная с 0).
Column — данные текущего столбца.
State — состояние ячейки. Может быть:

  • gdSelected — ячейка выделена
  • gdFocused — фокус ввода в ячейке
  • gdFixed — ячейка — заголовок столбца.

Задание 5. Изменение цвета шрифта записей сотрудников, относящихся к отделу Бухгалтерия, на красный.

Рисунок 6. Выделение строк
Заметим сразу, что наличие пустых столбцов создает дополнительные, но решаемые проблемы. Код события OnDrawColumnCell придется переделать, он будет таким:


var s: String;
begin Null then s:= ADOTable1[‘fam’] + ‘ ‘;
if ADOTable1[‘nam’] <> Null then s:= s + Copy(ADOTable1[‘nam’], 1, 1) + ‘.’;
if ADOTable1[‘par’] <> Null then s:= s + Copy(ADOTable1[‘par’], 1, 1)+ ‘.’;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end
else
if Column.Index = 5 then //если это пустой столбец с кнопкой «. «
begin
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Exit;
end
else TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text); //все остальные столбцы
end;
end;

Разберемся с кодом. Вначале с помощью with мы указываем, что будем работать непосредственно со свойством DBGrid1.Canvas, которое отвечает за стиль прорисовки ячейки. Далее мы смотрим поле «Dep» текущей записи равно ли Бухгалтерия. Если да, то указываем, что цвет шрифта должен быть красным, а затем функцией FillRect(Rect) мы стираем стандартный вывод.
Далее мы определяем, прорисовывается ли в данный момент пустой сборный столбец с «Фамилия И.О.». Если это он, то мы формируем переменную s с нужными данными и выводим их, как в прошлый раз.
Если же это пустой столбец с кнопкой «…», то мы делаем стандартный вывод и выходим из процедуры. Если мы этого не сделаем, то получим ошибку программы.
Все остальные столбцы мы выводим строкой

TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);

Обратите внимание, что мы добавили по два пикселя к крайней левой и крайней верхней координате ячейки. Если этого не сделать, то новая прорисовка не будет целиком закрашивать старую (рис.7):

Рисунок 7. Некорректная прорисовка
Количество добавляемых 2пикселей зависит от формата данных и размера шрифта. Обычно это определяется путем проб. Например, ячейка может содержать цифры, которые обычно прижимаются к правому краю, и тут двумя пикселями не обойтись.
Сделать проверку на тип данных можно, например, так:

//если текст, сдвинем только на 2 пикселя
if Column.Field.DataType = ftString then TextOut(Rect.Left, Rect.Top+2, Column.Field.Text)
//если цифры, сдвинем их вправо на 28 пикселей
else TextOut(Rect.Left+28, Rect.Top+2, Column.Field.Text);

Выделение строки красным текстом может оказаться недостаточным для заказчика. Что, если он потребует, чтобы эти строки выделялись красной строкой с белым шрифтом? Тогда вместо

Font.Color:= clRed;
FillRect(Rect);

вам придется написать

//выводим все ячейки строки белым текстом по красному фону:
Brush.Color:= clRed;
Font.Color:= clWhite;
FillRect(Rect);

Как видите, подсвойство DBGrid1.Canvas.Brush.Color отвечает за цвет заливки ячейки, а DBGrid1.Canvas.Font.Color за цвет выводимого в ней шрифта.

Компонент TDBCtrlGrid

Компонент TDBCtrlGrid (стр.DataControls) внешне напоминает компонент TDBGrid, но никак не связан с классом TCustomDBGrid, а наследуется напрямую от класса TWinControl.
Этот компонент позволяет отображать данные в строках в произвольной форме. Компонент представляет собой набор панелей, каждая из которых служит платформой для размещения данных отдельной записи набора данных. На панели могут размещаться любые компоненты отображения данных, предназначенные для работы с отдельным полем. С каждым таким компонентом можно связать нужное поле набора данных. При открытии набора данных в компоненте TDBCtrlGrid на каждой новой панели создается набор компонентов отображения данных, аналогичный тому, который был создан на одной панели во время разработки.
На панель можно переносить только те компоненты отображения данных, которые показывают значение одного поля для единственной записи набора данных. Нельзя использовать компоненты TDBGrid, TDBCtrlGrid, TDBRichEdit, TDBListBox, TDBRadioGroup, TDBLookupListBox.
Компонент может отображать панели в одну или несколько колонок. Для задания числа колонок панелей используется свойство ColCount. Число видимых строк панелей определяется свойством RowCount. Вертикальное или горизонтальное размещение колонок панелей зависит от значения свойства Orientation.
Размеры одной панели определяются свойствами panelHeight и Panelwidth. Они взаимосвязаны с размерами самого компонента. При изменении значений свойств PanelHeight и Panelwidth размеры компонента изменяются таким образом, чтобы в нем помещалось указанное в свойствах colcount и RowCount число панелей и наоборот.
Не рекомендуется размещать на панели компоненты TDBMemo и TDBimage, т. к. это может привести к значительному снижению производительности.

Задание 6. Работа с компонентом DBCtrlGrid.
Установите на форму компонент DBCtrlGrid.
Укажите в его свойстве DataSource ссылку на компонент DataSource1.
Установите на DBCtrlGrid следующие компоненты (рис.8):
DBText1 (DataField=fam), DBText2 (DataField=Nam), DBText3 (DataField=Par),
DBEdit1 (DataField=Dep),
DBComboBox1 (DataField=Sex, в свойстве Items задайте две строки «муж» и «жен»),
для слов «Отдел» и «Пол» установите компоненты Label1 и Label2.
Запустите программу и посмотрите как выглядит компонент DBCtrlGrid (рис.9).

Рисунок 8. Форма в процессе разработки

Рисунок 9. DBCtrlGrid после запуска программы

Использование компонента табличного просмотра/редактирования Grid

Читайте также:

  1. II. ИСПОЛЬЗОВАНИЕ НАПОЛЬНЫХ ВЕСОВ
  2. Microsoft SQL Server 2000. Создание и использование хранимых процедур и пользовательских функций.
  3. Антонимы и их стилистическое использование.
  4. Аэробное дыхание. Химизм и использование энергии м-о
  5. Взлет самолета с использованием неполной взлетной тяги двигателей
  6. Вопрос: CASE –средства. Этапы создания информационных систем с использованием CASE-средств.
  7. Все отношения, связанные с использованием объектов интеллекту­альной собственности, входит в предмет регулирования граж­данского права, а следовательно, имеют правовую охрану.
  8. Второе: В аяте использовано условное использование. 1 страница
  9. Второе: В аяте использовано условное использование. 2 страница
  10. Второе: В аяте использовано условное использование. 3 страница
  11. ВЫВОД ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ ДВИЖЕНИЯ С ИСПОЛЬЗОВАНИЕМ ТЕОРЕМЫ ОБ ИЗМЕНЕНИИ КИНЕТИЧЕСКОЙ ЭНЕРГИИ МЕХАНИЧЕСКОЙ СИСТЕМЫ
  12. Государственное управление использованием и охраной водных объектов

Создание многотабличных форм при помощи конструктора

Фактически, мастер создания многотабличных форм имеет только одно преимущество, а именно скорость разработки. Наряду с этим он обладает рядом крупных недостатков: необходимость русификации созданного интерфейса; большая сложность работы конечного пользователя, т.к. требуется знание логики и структур данных; сложность внесения изменений в программный код; количество таблиц, используемых формой, ограничено двумя и т.д.

Гораздо более эффективным представляется создание многотабличных форм при помощи конструктора. В этом случае разработчик не ограничен никакими условиями, кроме требований системы. Для запуска конструктора в окне запроса способа создания экранных форм (см. рис. 1) следует выбрать New Form, после чего, в рабочей области главного окна VFP появится окно конструктора форм и окно свойств. Рекомендуется в окружение данных формы изначально добавить все таблицы, которые будут использоваться в дальнейшем. (Добавление таблиц в окружение данных формы описано в предыдущей работе.) В случае если в самой базе данных определены связи между таблицами, они будет перенесены в окружение данных формы, но с небольшими оговорками, а именно:

1. Независимо от определения направления связи в базе данных, в окружении данных формы главной будет считаться таблица, добавленная первой. Изменить это в дальнейшем нельзя.

2. В окружении данных формы не может быть таблицы, являющейся дочерней более чем для одной другой таблицы. Связь будет установлена только для одной родительской таблицы, другая же будет утеряна. Установка связи насильственно проблему не решает, т.к. являющаяся по логике базы данных родительской, таблица будет дочерней, что непосредственно отразится на правильности отображаемых данных.

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

Т.к. одной строке данных в родительской таблице могут соответствовать произвольное количество строк дочерней таблицы, возникает необходимость отображения множественного массива однотипных записей. Для этого существует стандартный компонент Grid, позволяющий отображать данные на форме в виде таблицы (рис. 9). Для добавления этого компонента на форму достаточно выбрать его на панели Form Controls и щелкнуть левой кнопкой мыши в произвольном месте созданной формы. После этого пустой компонент будет добавлен на форму и станет доступным для редактирования (рис.10). Его свойства и методы можно просмотреть и отредактировать в окне Properties.

Рис. 9 Окно Form Controls с выделенным компонентом Grid

Рис. 10 Форма с добавленным пустым компонентом Grid

Основные свойства компонента Grid Таблица 1.

Свойства Назначение
ColumnCount Определяет количество столбцов в Grid’е. По умолчанию установлено –1, что является признаком отсутствия столбцов вообще.
DeleteMark Определяет наличие столбца в левой части таблицы с признаком пометки на удаление.
GridLines Определяет начертание сетки таблицы внутри самого компонента.
Name Задает имя компонента, по которому будет осуществляться дальнейшее обращение к нему.
ReadOnly Определяет свойство разрешения записи
RecordSource Определяет имя источника данных.
RecordSourceType Определяет тип источника данных. Допускаются значения: 0 – Table таблица базы данных 1 – Alias открытая рабочая область 2 – Prompt источник запрашивается у пользователя в процессе работы 3 – Query файл запроса 4 – SQL Statement результат выполнения команды SELECT – SQL
RowHeight Определяет высоту строк. Задается для всех отображаемых строк.
ScrollBars Задает наличие полос прокрутки.
Visible Определяет видимость компонента на форме.

Обратите внимание, что при установке значения свойства ColumnCount больше 0, в окне Properties станут доступны свойства подобъектов (рис. 11). Из рисунка видно, что сам компонент Grid состоит из составных объектов Column, которые в свою очередь состоят из подобъектов Header и Text. Для редактирования свойств подобъекта Grid’а необходимо его выбрать в ниспадающем списке окна Properties.

Рис. 11 Иерархия объектов компонента Grid

У объектов типа Column наиболее значимым является свойство ControlSource, которое определяет источник данных для столбца, а точнее, название таблицы и поля, разделенные точкой, из которого будут браться данные для отображения, например Ordsaled.icdOrder. У столбцов так же существует свойство видимости Visible, используя которое можно скрывать от пользователя данные, которые он не должен видеть.

Каждый столбец имеет заголовок Header, который определяет надпись вверху столбца. За текст надписи отвечает свойство объекта Header Caption. Значение надписи заголовка столбца может быть установлено как в режиме разработки путем явного указания текста в свойствах объекта, так и в процессе работы с формой посредством явного присваивания свойства, например:

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

ПодобъектText каждого столбца, является объектом ввода Text Box и обладает всеми его свойствами. (Свойства Text Box описаны в предыдущей работе.) Существует возможность расширения набора типов компонентов столбца, т.е. вместо текстового поля отображать в столбце Grid’а другие объекты. Для этого необходимо в режиме конструктора форм выбрать компонент Grid, правой кнопкой мыши вызвать контекстное меню и выбрать пункт Edit (рис 12). При этом система перейдет в режим редактирования составного объекта, о чем будет свидетельствовать визуальное изменение рамки выбранного объекта (вместо точек изменения размера объекта на экране появится цветная полосатая рамочка вокруг объекта). После этого на панели Form Controls нужно выбрать добавляемый компонент и левой кнопкой мыши щелкнуть на столбце Grid, в который будет добавлен выбранный компонент. После этого в свойстве столбца Grid CurrentControl появится возможность выбора текущего типа объекта столбца (рис. 13). Работа с новым типом производится в стандартном режиме.

При запуске формы новый тип объекта по умолчанию будет отображаться только в текущей строке. Для управления отображением служит свойство столбца Sparse, изначальное значение которого True. Установив значение этого свойства False, разработчик может принудительно заставить систему отображать новый тип объекта в каждой строке Grid. В случае, если высоты строки для отображения нового типа объекта недостаточно ее следует увеличить путем изменения значения свойства Grid RowHeight.

Рис. 12 Переход в режим редактирования составного объекта

Рис. 13 Изменение типа объекта столбца

Несмотря на явное преимущество компонента Grid для отображения табличных данных (компактное представление данных, возможность осуществления навигации пользователем при помощи полос прокрутки и т.п.) не следует чрезмерно увлекаться его использованием, т.к. интерфейс экранной формы в некоторых случаях будет слишком перегружен, что, в конечном счете, приведет к снижению эффективности работы пользователя.

Обратите внимание, что при изменении содержимого источника данных (добавление/удаление записей), а так же при изменениях в свойствах Grid, возникает необходимость обновления прорисовки формы командой thisform.Refresh(). Кроме того, следует помнить, что любое закрытие источника данных в процессе работы приведет к его потере для компонента Grid. В этом случае придется предусмотреть программное восстановление связи с источником данных. Лучше всего программный код прописать сразу после нового открытия источника. При этом программа должна содержать команды всех необходимых изменений свойств Gridи его подобъектов, например:

*Использование оператора WITH . ENDWITH для работы со свойствами некоторого объекта

*в основном используется для уменьшения объема прописываемого кода

*строки, начинающиеся с символа * являются необязательными коментариями ;)

*Указаный блок WITH . ENDWITH эквивалентен последовательному использованию команд

*Установка связи с источником данных

*в качестве источника указана рабочая область с именем goods

*изменение названия первого столбца

*далее могут располагаться другие команды по изменениям свойства Grid

Организация работы с несколькими таблицами на одной форме

В принципе работа с несколькими таблицами ничем не отличается от работы с одной таблицей. Только необходимо помнить, что все операции проводятся по умолчанию в текущей рабочей области. Соответственно, при работе с многотабличной формой необходимо перед выполнением некоторых действий следует сделать нужную рабочую область текущей командой SELECT , например:

*выбрать рабочую область ordsalem

*добавить пустую запись

*выбрать рабочую область ordsaled

*перейти к следующей записи

данный программный код добавит пустую запись в таблицу ORDSALEM, а в таблице ORDSALED передвинет указатель на следующую запись. При этом все дальнейшие операции будут проводиться с таблицей ORDSALED, пока не будет выбрана другая рабочая область!

Возможен вариант явного указания рабочей области, для которой будет выполнена команда, путем использования служебного слова IN в тексте самой команды: APPEND BLANK IN ORDSALEM. Этот вариант выгоден, когда необходимо выполнить очень небольшой блок команд, при этом текущая рабочая область останется не измененной. Указанная команда не изменяет текущую рабочую область, и дальнейшая работа будет производиться с рабочей областью, которая была текущей до выполнения команды.

В отличии от жестких решений, предлагаемых мастером построения, разработчик имеет гораздо большую свободу при организации интерфейса экранных форм. Одним из вариантов организации работы с несколькими таблицами является создание персонального набора элементов управления для каждой таблицы, т.е. при работе с двумя таблицами, на форме организуются два набора кнопок управления. При этом желательно каждый набор визуально выделять в отдельный функциональный блок и, рекомендуется, использовать разные поясняющие текстовые надписи на самих кнопках, например: «Добавить заказ», «Добавить товар в заказ». Соответственно в программном коде кнопок, следует явно указывать, для какой таблицы производится действие.

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

Рис. 14 Пример организация работы с несколькими таблицами

Дата добавления: 2015-05-09 ; Просмотров: 219 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Моя первая таблица в jqGrid

Моя первая таблица

Для этого примера и как пример, на который будут ссылаться все остальные статьи, мы создадим таблицу товарных счёт-фактур.

Наш пример будет отображать следующую информацию:

Данные

Нам потребуется таблица с данными в этом формате. Этот пример использует MySQL:

Теперь заполните эту таблицу какими-нибудь данными.

(Здесь таблица с 644 записями. Можете использовать её или придумайте свои данные. Колонка «A» пуста, так как она должна увеличиваться автоматически вашей базой данных.)

HTML-страница

HTML-страница выполняет три цели: загружает все необходимые jqGrid файлы, содержит место для таблицы, содержит инструкции по настройке таблицы.

Полное руководство по CSS Grid

CSS Grid Layout — самая мощная система компоновки из доступных на данный момент в CSS. Это двумерная система, которая может обрабатывать как колонки так и строки, в отличии от Flexbox, который в значительной степени является одномерной системой. При работе с CSS Grid, вы применяете CSS правила и родительским элементам (которые становятся Grid контейнерами) и к дочерним элементам (которые становятся Grid элементами).


Введение

CSS Grid Layout (aka «Grid») — это двумерная система компоновки основанная на сетке, цель которой заключается в том чтобы полностью изменить способ проектирования пользовательских интерфейсов основанных на сетке. CSS всегда использовался для разметки веб-страниц, но никогда не делал эту работу хорошо. Сначала мы использовали таблицы, потом обтекания (floats), позиционирование и инлайновые блоки (inline-block), но все эти методы по существу являются просто хаками и опускают много важных функциональных возможностей (например, вертикальное выравнивание). Flexbox помог, но он предназначен для более простых одномерных макетов, а не для сложных двумерных (на самом деле Flexbox и Grid очень хорошо работают вместе). CSS Grid’ы — это первый модуль созданный специально для решения проблем компоновки, которые до сих пор мы решали с помощью хаков при создании сайтов. Есть две основные вещи, которые вдохновили меня на создание этого руководства. Первое, это замечательная книга от Rachel Andrew’s Get Ready for CSS Grid Layout. Это подробное и понятное введение в CSS Grid’ы, которое является основой для всей этой статьи. Я настоятельно рекомендую купить и прочитать его. Вторая вещь, которая меня вдохновила — это A Complete Guide to Flexbox (Полное руководство по Flexbox) от Chris Coyier’s, которая стала моим основным ресурсом по Flexbox. Она помогла большому количеству людей, о этом свидетельствует тот факт, что это лучший результат в поисковой выдаче при запросе»Flexbox» в Google. Вы увидите много похожего между этой статьей и моей, потому что почему бы не украсть у лучших?

Моя цель в этом руководстве — это возможность представить вам концепции CSS Grid’ов так как они существуют в самой последней версии спецификации. Поэтому я не буду освещать устаревший синтаксис для IE и сделаю всё возможное, чтобы это руководство регулярно обновлялось, по мере изменения спецификации.

Основы и поддержка браузерами

Для того чтобы начать работу, нам нужно определить элемент-контейнер с помощью display: grid, настроить размеры колонок и строк с помощью grid-template-columns и grid-template-rows, а также разместить его дочерние элементы внутри сетки с помощью grid-column и grid-row. Так же как и во Flexbox, порядок элементов в источнике сетки, не имеет значения (прим. переводчика: в HTML разметке). Ваш CSS может размещать их в любом порядке, что собственно упрощает перегруппировку сетки с помощью медиа запросов. Представьте, что вы определяете разметку всей страницы, а затем полностью переставляете её, чтобы разместить элементы под другую ширину экрана всего лишь с помощью нескольких CSS строк кода. CSS Grid — это один из самых мощных CSS модулей, представленных когда-либо. По состоянию на март 2020 года, многие браузеры уже поддерживают CSS Grid, без префиксов: Chrome (включая Android), Firefox, Safari (включая iOS), и Opera. Internet Explorer 10 и 11 поддерживают его но с реализацией более старого синтаксиса. Была анонсирована поддержка в Edge, но её пока нет.

Своя сущность в типовом интерфейсе коробочного Битрикс24

Привет!
Продолжаем учиться правильно кастомизировать Битрикс24

В этой статье — создаем свою сущность, но в типовом интерфейсе. Это позволит разработчику не изобретать велосипед, а пользователю — использовть уже существующий опыт работы с системой. Слово коллегам из Интерволги .

В изучении этой темы вам поможет исходный код , а так же запись вебинара, на котором мы показали решения «в живую»:

В данной статье разберем создание сущности в Б24 «с нуля». Такая задача обычно возникает в крупных проектах с большими и сложными структурами данных. Создание сущности (в целом) необходимо, если компания собирается вести учет чего-либо в Б24. Как правило, с этими данными также связана некоторая логика, которая исходит из процессов компании.

Данная статья больше ориентирована на повторение UX Б24 при работе с данными. Сотрудники компании уже привыкли к интерфейсам CRM, задач и т. д., знают их возможности и умеют ими пользоваться. Полагаясь на этот пользовательский опыт вы можете снизить затраты на обучение сотрудников.

Способы создания сущностей в Б24

Нам видятся два основных подхода:

  • универсальные списки;
  • создание «с нуля»: таблица в БД и разработка интерфейсов.

Универсальные списки хороши тем, что для работы с ними можно обойтись даже без программиста. По сути — это инфоблоки в публичной части. Для списков уже реализованы представления «список», «детальный просмотр» (карточка), форма редактирования, управление правами доступа. Сопутствующую логику можно реализовать с помощью модуля бизнес-процессов.

Списки не подойдут, если:

  • ваши доработки неудобно реализовывать в списках;
  • реализация ваших доработок в списках трудоемка/не выгодна, а полученный в результате код будет трудно сопровождать в будущем;
  • требуется тонкая настройка прав доступа (на уровне отдельных полей, действий и т. д.);
  • для вашей сущности нужны кастомные интерфейсы, сильно отличающиеся от списков.

В таком случае имеет смысл рассмотреть подход к разработке «с нуля». Так или иначе, следует здраво оценить оба подхода, перед тем как принять решение.

В данной статье подробно разберем второй подход.

Даже если вы не собираетесь разрабатывать сущности вторым способом, мы все же рекомендуем изучить раздел о разработке представления «список». В корпоративных системах вывод списков — очень частая задача.

В статье будут приводиться лишь фрагменты кода. Рекомендуем установить готовый модуль и изучать его код параллельно с чтением статьи. Модуль нужно разместить в каталоге /local/modules.

Пример задачи — торговые точки CRM

В качестве примера возьмем небольшую задачу: создадим сущность «Торговая точка», разработаем к ней необходимые интерфейсы и реализуем связь сделок с торговыми точками.

Торговая точку будем описывать небольшим количеством полей (этого достаточно для примера):

  • название;
  • адрес;
  • ответственный.

На самом деле, эту задачу можно решить с помощью универсальных списков, однако цель статьи — описать процесс создания сущности «с нуля» в Б24.

В данной статье мы не будем рассматривать (и реализовывать):

  • проверку прав доступа (не помещается ;
  • кеширование (здесь нет ничего специфического для Б24, чтобы узнать, как делать кеширование в компонентах, посмотрите курсы Академии 1С-Битрикс).

Структура решения

Для хранения данных сущности создадим таблицу в БД. Для этого сначала нужно создать модуль.

Для создания интерфейса (список, просмотр, редактирование) будем использовать компоненты Б24. Нам понадобится создать комплексный компонент (роутер), с помощью которого мы свяжем представления с URL. Для каждого представления потребуется разработать отдельный компонент. Таким образом, чтобы реализовать все операции CRUD, потребуется разработать 4 компонента.

Структура компонентов на рисунке ниже.

Связь сделок с торговыми точками мы реализуем путем создания своего типа пользовательского поля «Привязка к торговой точке». Чтобы вывести список привязанных сделок в карточке торговой точки, разработаем еще один компонент.

Модуль назовем academy.crmstores. Код модуля расположим в каталоге /local/modules/academy.crmstores.

Опишем класс сущности. Для этого будем использовать D7 ORM.

В данном классе определено два метода. getTableName возвращает имя таблицы, в которой будут храниться данные. Метод getMap возвращает структуру таблицы. Подробнее об описании сущностей с помощью D7 ORM смотрите в документации .

Осталось добавить в установщик модуля создание этой таблицы. В методе InstallDB напишем код:

Теперь можно установить модуль в административной панели и убедиться, что таблица создалась. Мы также заполнили ее тестовыми данными.

Создание раздела и разработка роутера

Разработка комплексного компонента (роутера)

В разделе торговых точек в публичной части (который мы создадим позднее) управлять отображением данных будет комплексный компонент academy.crmstores:stores. Разместим его в каталоге /local/components/academy.crmstores/stores.

В рамках учебной задачи мы не будем описывать параметры компонента, за исключением настроек ЧПУ. Кроме того, сделаем так, чтобы компонент мог работать только в режиме ЧПУ.

Настройки опишем в файле .parameters.php:

Создадим шаблон встроенный шаблон .default с тремя страницами — list.php, details.php и edit.php. На каждой странице для начала просто выведем ее название.

Теперь создадим страницу /crm/stores/index.php и вызовем на ней написанный компонент. При запросах по URL /crm/stores/, /crm/stores/0/ и /crm/stores/0/edit/ должны открываться разные страницы.

Показ меню раздела CRM и добавление пункта меню «Торговые точки»

Меню раздела в CRM сделано не с помощью компонента bitrix:menu, как это обычно бывает, а с помощью компонента bitrix:crm.control_panel. Чтобы вывести меню CRM на каждой странице шаблона комплексного компоненты сделаем следующий вызов.

После переустановки модуля должен появиться пункт меню «Торговые точки».

Разработка компонента списка

Код компонента списка разместим в каталоге /local/components/academy.crmstores/stores.list.

В классе компонента заведем метод getStores, который возвращает массив торговых точек, а также получает данные привязанных ответственных сотрудников. На вход метод принимает параметры выборки торговых точек.

Вызовем его в executeComponent и поместим результат в $arResult.

Также создадим встроенный шаблон .default, в котором будем выводить список.

Выбор компонента для вывода таблицы и его вызов

Выводить список торговых точек будем с помощью компонентов Б24. Для вывода списков используют компонент «Грид».

В Б24 существует несколько различных гридов. Условно можно разделить их на базовые и производные (специфические для некоторых модулей).

К базовым относятся:

  • bitrix:main.interface.grid (устарел);
  • bitrix:main.ui.grid.

Визуальная разница между старым и новым:

bitrix:main.interface.grid bitrix:main.ui.grid

Для некоторых модулей разработаны специальные версии гридов. Все они являются «обертками» над базовыми и расширяют их возможности. К таким относятся:

  • bitrix:crm.interface.grid;
  • bitrix:disk.interface.grid;
  • bitrix:bizproc.interface.grid.

Компонент crm.interface.grid является законченным решением для создания списочных интерфейсов. Помимо таблицы, он также позволяет создать «фильтр + поиск». В других случаях пришлось бы дополнительно вызывать компоненты main.ui.filter и main.ui.selector. Поэтому именно crm.interface.grid мы будем использовать для отображения списка торговых точек.

Вызовем этот компонент в шаблоне компонента списка (academy.stores:stores.list).

Шаблон titleflex сам встроит фильтр в заголовок страницы. В параметрах компонента мы передаем GRID_ID и некоторые настройки, влияющие на его поведение на стороне клиента (в частности, грид не будет менять URL текущей страницы и не будет записывать в историю браузера действия пользователя при смене сортировки, фильтров и т. п.).

Как вы знаете, каждый сотрудник может сконфигурировать грид под свои задачи. Сотрудник может управлять отображением столбцов, их порядком, управлять видимостью полей в фильтре, создавать именованные фильтры… Б24 сохраняет настройки каждого грида. Для этого необходимо задавать GRID_ID — настройки будут связаны с ним.

Теперь вызовем компонент списка на странице комплексного компонента. Вы должны увидеть пустой грид с надписью «Нет данных».

Передача данных в грид: столбцы и строки

В компоненте списка опишем столбцы грида следующей структурой и передадим их в шаблон через $arResult.

Смысл настроек столбцов следующий:

Параметр Описание
id Идентификатор столбца, по которому будет установлена связь с данными строки.
name Название столбца, которое увидит пользователь.
sort Идентификатор столбца при смене сортировки. При смене сортировки грид отправит AJAX-запрос, где будут указаны название столбца по которому нужно отсортировать (из этого параметра) и направление сортировки.
first_order Направление сортировки, которое должно быть установлено при переключении сортировки на данный столбец с другого.
type Тип данных столбца. Может незначительно влиять на формат вывода.
default Когда пользователь открывает грид первый раз, будут показаны только столбцы, у которых этот параметр установлен в значение true. Также он используется при сбросе настроек грида.

Существуют и другие настройки. О них вы можете узнать из кода самого грида.

Полученные из БД торговые точки мы уже передали в шаблон. Сформируем массив строк для грида в шаблоне.

Для вывода ответственного используем метод CCrmViewHelper::PrepareUserBaloonHtml, который выводит ссылку и показывает выноску с информацией о пользователе при наведении указателя. Перед использование не забудьте подключить модуль crm.

Передадим строки и столбцы в грид.

Теперь вы должны увидеть все данные в таблице.

При смене сортировки грид отправляет AJAX-запрос на текущую страницу, при этом вызывается наш компонент списка. Для получения данных о состоянии грида (какая сортировка сейчас установлена, какие столбцы видит пользователь и т. д.) воспользуемся классом \Bitrix\Main\Gr >

Для получения текущей сортировки используем метод getSorting. То, что он возвращает нельзя просто подставить в getList. Формат подходит, но доверять возвращаемому значению можно не больше, чем любым другим значениям из $_REQUEST. Либо он может вообще вернуть пустой массив, если пользователь еще ни разу не менял сортировку.

Мы отфильтровываем возвращаемые им значения, таким образом, чтобы остались только поля, поддерживаемые getList’ом.

Если же в результате не осталось настроек сортировки — устанавливаем сортировку по-умолчанию.

Теперь $sort можно использовать в getList.

Поскольку фактическая сортировка может отличаться от той, что пришла в запросе из грида, гриду нужно сообщить фактическую сортировку, чтобы она была правильно отображена пользователю. Передайте $sort как значение параметра SORT компонента грида.

Чтобы фильтр появился, его необходимо настроить. А именно — указать по каким полям можно фильтровать и задать предустановленные именованные фильтры.

Поля для фильтра опишем в компоненте списка следующим образом.


Настройки похожи на описание столбцов:

Параметр Описание
id Идентификатор поля, который будет сообщен компоненту при установке фильтра пользователем.
name Название поля фильтра, которое увидит пользователь.
default Будет ли отображено поле в форме фильтра по-умолчанию.
type Элемент управления в форме фильтра.

Тип custom_entity активирует компонент bitrix:main.ui.selector и выводит всплывающее окно для выбора сотрудника из структуры или поиска.

Создадим один именованный фильтр «Мои торговые точки» (те, в которых текущий поьзователь является ответственным). Для этого фильтра указываем его название и значения полей из массива выше.

Помимо прочего мы отключаем возможность вводить текст в строке фильтра, т. к. полнотекстовый поиск торговых точек мы реализовывать не будем. ENABLE_LIVE_SEARCH равно false, DISABLE_SEARCH — true.

Теперь в заголовке над списком появился привычный фильтр

Вывод количества выбранных элементов

Компонент main.ui.grid позволяет передать ему количество выбранных элементов как параметр. Компонент crm.interface.grid, который мы используем, — нет. Вместо этого мы должны разработать небольшой служебный AJAX-обработчик, который будет возвращать необходимые данные гриду.

Поскольку этот обработчик будет поддерживать лишь одну операцию, сделаем его частью компонента списка. Создадим метод processServiceActions и вызовем его из метода executeComponent. Ниже фрагмент метода processServiceActions.

Метод принимает на вход текущий установленный пользователем фильтр и, с помощью метода StoreTable::getCount вычисляет количество элементов, соответствующих фильтру. Гриду требуется вернуть JSON-объект, в котором по пути DATA → TEXT находится текст «Всего: ».

Теперь настроим грид. В первую очередь, подключим JS-класс, предоставляющий гриду некоторые методы.

В $arResult[‘SERVICE_URL’] компонент помещает URL текущей страницы с параметром sessid. Сообщения для диалога удаления понадобятся позже.

Теперь при клике по ссылке «Показать количество» (внизу, под списком) будет появляться количество элементов.

До клика После клика

Реализация постраничной навигации

До текущего момента мы выводили в списке все выбранные элементы на одной странице. Если элементов будет достаточно много, интерфейс начнет «тормозить». Чтобы решить эту проблему, реализуем постраничную навигацию.

Чтобы узнать, какой размер страницы установил пользователь (внизу справа от списка), воспользуемся все тем же объектом класса \Bitrix\Main\Gr >

Этот метод вернет массив с одним элементом nPageSize — количество записей на одной странице.

Саму логику постраничной навигации мы тоже не будем реализовывать самостоятельно, а воспользуемся классом \Bitrix\Main\UI\PageNavigation.

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

Наша цель — получить параметры для getList. Чтобы получить корректные значения, сначала объект постраничной навигации нужно настроить. Мы задаем размер страницы и количество элементов, соответствующих текущему фильтру.

Номер текущей страницы мы получаем из параметров запроса: $request->get(‘page’). Надо заметить, что в гриде есть ссылка для перехода к последней странице. При клике по ней параметр page примет значение -1. Этот случай тоже нужно учитывать.

Теперь остается лишь указать limit и offset в параметрах getList. С помощью объекта постраничной навигации это сделать очень просто.

В гриде (снизу) должна появиться постраничная навигация с кнопкой «Показать еще».

Реализация действий с несколькими строками

Строки в гриде можно отмечать флажками. Реализуем возможность выполнять действия над отмеченными строками.

Сначала добавим кнопки на панель инструментов (она расположена в нижней части грида и до этого момента оставалась пустой). В шаблоне компонента списка создадим экземпляр класса \Bitrix\Main\Gr >

На панели должны появиться кнопка «Удалить» и флажок для выбора всех записей.

При нажатии на кнопку «Удалить» грид отправит запрос на текущий URL с тремя параметрами:

  • действие — удаление;
  • отмечен ли флажок «для всех»;
  • идентификаторы строк, отмеченных флажками.

Обработаем этот запрос в классе компонента списка. Заведем метод processGr >

Сначала происходит сбор идентификаторов торговых точек, с которыми нужно выполнить действие, в зависимости от состояния флажка «Для всех», затем идет обработка команды удаления.

Реализация действий над одной строкой

Добавим для каждой строки контекстное меню с тремя действиями: «Просмотреть», «Редактировать», «Удалить».

Для этого добавим массив actions к описанию строки для грида в шаблоне компонента списка.

Назначение параметров действий понятно по их названию. За исключением параметра DEFAULT. Если у какого-либо действия установить его в значение true, то это действие будет выполняться при двойном клике по строке.

Для перехода к карточке торговой точки мы используем функцию BX.Crm.Page.open. Что касается удаления — написанный код заставит грид отправить запрос на выполнение действия удаления с одним идентификатором строки. Запрос будет обработан в методе, который мы написали для действий с несколькими строками.

Теперь у каждой строки появилось выпадающее меню.

Вывод кнопки создания новой торговой точки

На этом функциональность списка торговых точек можно считать законченной. Завершим разработку представления «список» добавлением панели инструментов с кнопкой создания торговой точки.

На странице списка шаблона комплексного компонента вызовем компонент bitrix:crm.interface.toolbar, в настройках передадим, какую кнопку мы хотим вывести. Вызов этого компонента нужно сделать перед вызовом компонента списка.

Теперь справа в строке заголовка появилась кнопка.

Разработка компонента детального просмотра

Для вывода карточки торговой точки в режиме просмотра и редактирования будем использовать компонент bitrix:crm.interface.form. Это «старая» карточка CRM, которая использовалась до появления слайдера. На момент написания статьи, мы не можем повторно использовать новую, это связано с ее внутренними ограничениями. В будущем, надеемся, это станет возможным.

Для реализации карточки в режиме просмотра разработаем компонент academy.crmstores:store.show. Идентификатор торговой точки для отображения компонент принимает как параметр.

Выбор данных торговой точки

Код компонента довольно прост. Выполняется получение данных с помощью метода StoreTable::getById, а также задается заголовок страницы вида «Торговая точка № — ».

Также в классе определена константа — идентификатор формы для просмотра (по аналогии с идентификатором грида). TACTILE_FORM_ID — это идентификатор формы для редактирования. В приведенном коде он берется из класса компонента редактирования (которого у вас еще нет, но ID нужен уже сейчас .

В шаблоне компонента просто вызываем crm.interface.form и передаем в него данные.

GRID_ID, FORM_ID, TACTILE_FORM_ID — идентификаторы грида, текущей формы, формы редактирования, соответственно. ENABLE_TACTILE_INTERFACE, SHOW_SETTINGS — включают возможность для пользователя перемещать, переименовывать, скрывать/показывать поля, группировать их по разделам.

Структурно, форма состоит из вкладок, вкладка состоит из разделов и полей. Визуально это хорошо видно на форме настройки CRM:

Карточка CRM — такая же форма, но с той лишь разницей, что поля первой вкладки выводятся выше самих вкладок и есть возможность их перемещать, скрывать/показывать и т. д., минуя окно настроек. Это называется «тактильным» интерфесом (шаблон show компонента crm.interface.form).

В настройках компонента мы описали одну вкладку. Ее параметр display равен false для того, чтобы она не выводилась в списке вкладок — это логично, т. к. ее поля и так выводятся вне зависимости от выбранной вкладки.

Для описания полей мы используем три типа поля:

  • section — раздел (технически, это поле);
  • label — простой текст в значении поля;
  • custom — HTML-код в значении поля.

В целом, суть настроек полей понятна по названию. За исключением isTactile. Если вкратце, то он должен быть установлен в значение true, иначе поле в форме не появится.

Ответственного за торговую точку выводим с помощью метода CCrmViewHelper::PrepareFormResponsible (не забудьте подключить модуль crm).

Вывод карточки торговой точки

На странице детального просмотра комплексного компонента вызовем три компонента:

  • bitrix:crm.control_panel — меню раздела CRM,
  • bitrix:crm.interface.toolbar — панель инструментов с кнопкой «Редактировать»,
  • academy.crmstores:store.show — наш компонент карточки в режиме просмотра.

Кнопку «Редактировать» описываем по аналогии с кнопкой «Добавить на странице списка».
ID торговой точки берем из переменных, полученных при обработке ЧПУ.

На странице просмотра появилась форма.

Разработка формы создания и редактирования

Подготовка данных для формы

Компонент редактирования торговой точки, в целом не сложный (кто из программистов не делал обработку форм? , но есть места, где нужно быть внимательным. Начнем с подготовки данных для формы.

Традиционно, в Битриксе для создания и редактирования данных используется одна и та же форма. Считается, что если идентификатор редактируемого элемента равен нулю, то форма работает в режиме создания. Вот небольшой пример:

  • /company/personal/user/1/tasks/task/edit/0/ — создание новой задачи
  • /company/personal/user/1/tasks/task/edit/1/ — редактирование задачи №1.

Логика подготовки данных следующая:

  1. создаем массив с данными «пустой торговой точки»;
  2. если передали идентификатор торговой точки, заменяем его данными этой точки;
  3. если при отправке формы произошли ошибки, заменяем данные на те, что отправил пользователь.

Про отправку формы можно пока не думать, ее рассмотрим позднее. Если в компонент передали идентификатор торговой точки, которого нет в БД, выводим ошибку и не показываем форму. Мы не знаем, каким образом пользователь перешел к форме. Если он хотел перейти к редактированию торговой точки, но ее не существует, то вывод формы создания новой точки может запутать пользователя.

Фрагмент метода executeComponent компонента academy.crmstores:store.edit.

Почти все данные в $arResult нужны форме. Наиболее важные: IS_NEW — создается ли новая торговая точка или редактируется существующая, от этого зависят кнопки под формой, BACK_URL — адрес, на который перейдет пользователь, если нажмет кнопку «Отмена», ERRORS — объект класса ErrorCollection, будет содержать ошибки валидации данных формы.

Вывод формы редактирования торговой точки

Для вывода формы будем использовать все тот же компонент bitrix:crm.interface.form, но с шаблоном edit и несколько другими параметрами.

В отличие от режима просмотра, мы используем другие типы полей — text и intarnet_user_search. Для вывода кнопок под формой мы используем параметр standard_buttons, чтобы не описывать их самостоятельно.

Вот, что у нас получилось:

При создании новой торговой точки (когда IS_NEW равно false) компонент выведет другие кнопки:

При нажатии на любую из кнопок, кроме «Отменить» будет отправлен запрос на текущий URL. Реализуем обработку формы в компоненте редактирования торговой точки.

Заведем несколько методов. isFormSubmitted будет определять, отправлена ли форма. Мы не ограничили отправку только методом POST.

На вход этого метода подаются данные торговой точки, которые были на момент первого открытия формы ($initialStore): «пустая» торговая точка при создании новой или данные из БД. Метод получает из параметров запроса данные торговой точки, отправленные пользователем и заменяет ими данные $initialStore. Затем полученные данные отправляются на валидацию, затем на запись в БД. В случае отсутствия ошибок на всех этапах, метод возвращает идентификатор созданной или обновленной торговой точки, в случае ошибок — false.

И осталась еще одна небольшая задача. Как вы знаете, после успешного сохранения данных необходимо сделать перенаправление пользователя на какую-либо страницу. Какую?

В зависимости от того, откуда пользователь перешел к форме редактирования и какую кнопку нажал, он будет ожидать определенного поведения. Опишем его для всех кнопок. Также мы будем поддерживать параметр запроса backurl, позволяющий другим интерфейсам указать URL, на которую нужно вернуть пользователя, когда он закончит редактирование.

Нажатая backurl Назначение
Сохранить и добавить еще Не важно Форма редактирования в режиме создания.
Форма редактирования в режиме создания. Не важно Форма редактирования этой же торговой точки.
Сохранить Задан Значение backurl.
Сохранить Не задан Карточка торговой точки в режиме просмотра.
В остальных случаях Список торговых точек.

Вот пример реализации этой логики в методе getRedirectUrl.

Обратите внимание, что в случае ошибок (когда не происходит перенаправление), мы заменяем данные для формы на те, которые отправил пользователь. Это нужно для того, чтобы после перезагрузки страницы введенные пользователем данные не пропали из формы.


На этом реализация обработки формы закончена. На текущий момент мы имеем свою сущность с полноценным интерфейсом для основных операций (CRUD) с ее данными.

Реализация связи сделок с торговыми точками

Разработка типа пользовательского поля «Привязка к торговой точке»

Чтобы дать возможность привязывать другие сущности к торговым точкам, разработаем специальный тип пользовательского поля «Привязка к торговой точке». Реализация, которую мы предлагаем используется лишь для демонстрации работоспособности подхода. Код типа поля следует значительно улучшить перед реальным использованием.

Полный код класса смотрите в приложенных исходниках. О создании типов пользовательских полей мы уже рассказывали в предыдущей статье . Подробное описание методов класса типа поля вы можете найти в классе CUserTypeString.

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

Также мы добавили модулю настройку — шаблон URL карточки торговой точки.

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

Редактирование сделки Просмотр сделки

Создание компонента для вывода связанных сделок

Выведем в карточке торговой точки список сделок, связанных с ней.

Поскольку список сделок, прежде всего, список, снова делаем грид .

На этот раз мы реализуем минимум возможностей. Создадим компонент academy.crmstores:store.bounddeals, который принимает на вход идентификатор торговой точки, а на выход выдает список сделок, которые с ней связаны. Код метода executeComponent довольно прост, ниже приведен его фрагмент.

Мы также добавили еще две настройки модуля: шаблон URL карточки сделки и название пользовательского поля, по которому будет устанавливаться связь сделки с торговой точкой.

В списке выведем только ID, название и сумму сделки. Для этого используем компонент bitrix:main.ui.grid.

Вывод связанных сделок в карточке торговой точки

Осталось вывести этот список в карточке торговой точки.

Вызовем компонент привязанных сделок в шаблоне компонента карточки торговой точки (academy.crmstores:store.show) и захватим его вывод с помощью функций буферизации.

Обратите внимание на параметр поля colspan. Карточка CRM — это двухколоночная таблица. Когда colspan установлен в значение true, то ячейка с названием поля не будет выведена, а ячейка значения поля будет расширена на две колонки.

Создание установщика модуля

Если вы хотите сделать тиражное решение, следует доработать установщик модуля.

Код установщика вы можете посмотреть, скачав исходные коды, которые приложены к статье. Здесь опишем лишь основные задачи методов класса academy_crmstores.

Метод Деятельность
DoInstall Регистрирует модуль в системе и запускает методы в следующем порядке:
  • InstallEvents;
  • InstallDB;
  • InstallFiles.
DoUninstall Запускает методы в следующем порядке, после этого помечает модуль как «не установленный»:
  • UnInstallFiles;
  • UnInstallDB;
  • UnInstallEvents.
InstallEvents Регистрирует обработчики двух событий:
  • OnAfterCrmControlPanelBuild — обработчик добавляет пункт меню «Торговые точки» в меню раздела CRM;
  • OnUserTypeBuildList — обработчик регистрирует тип пользовательского поля «Привязка к торговой точке»
InstallDB
  • Создает таблицу в БД для хранения данных сущности «Торговые точки».
  • Создает пользовательское поле UF_STORE в сделке.
InstallFiles
  • Копирует код компонентов в /local/components.
  • Добавляет в urlrewrite.php правило ЧПУ для торговых точек.
UnInstallEvents Удаляет события, зарегистрированные в InstallEvents
UnInstallFiles Удаляет код компонентов из /local/components и правило из urlrewrite.php.
UnInstallDB Ничего не делает в данном примере. Будет правильно, если сделать удаление в два шага и спрашивать пользователя, хочет ли он удалить таблицы модуля.

Заключение

Подведем итог. В Б24 есть два способа создания своей сущности:

  • универсальные списки;
  • «с нуля»: модуль, таблица, интерфейсы в публичной части.

Мы рассмотрели второй. Как видите, это не сложно: все строится из небольших «кирпичей», просто их много. В конце концов, кто из программистов не делал CRUD: список, просмотр и редактирование данных?

Такой подход бывает нужен при крупных доработках Б24.

На практике некоторые функции списка вам могут быть не нужны. Например, если вы используете грид для вывода отчета, вам не нужно делать удаление, редактирование и т. п.

Стоит еще раз отметить, что полагаясь на опыт работы пользователей с интерфейсами Б24, вы можете снижать затраты на обучение. В этом уроке мы как раз повторили интерфейсы Б24 для созданной сущности.

——
Спасибо за внимание
Материалы: исходный код , запись вебинара .
Автор статьи: Никита Калинин , компания Интерволга .

Описание компонента Delphi StringGrid

Компонент Delphi StringGrid используется для отображения информации в табличной форме. В панели компонентов Delphi расположен на закладке Additional.

В основном ячейки компонента StringGrid могут содержать строковые значения, но можно так же добавить изображения в ячейки StringGrid.

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

Рисунок: Компонент StringGrid

Свойства компонента Delphi StringGr > * Здесь указаны только специфические свойства данного компонента. Свойства типичные для большинства компонентов, такие как свойства позиционирования можно найти в отдельной статье.

Свойство Тип данных Описание
ColCount Целое число Количество колонок в таблице
RowCount Целое число Количество строк в таблице
DefaultColWidth Целое число Ширина колонок в таблице
DefaultRowHeight Целое число Высота строк в таблице
FixedCols Целое число Количество зафиксированных колонок слева таблицы
FixedRows Целое число Количество зафиксированных колонок сверху таблицы
GridLineWidth Целое число Ширина линии ограничивающиая ячейки таблицы
Options Вложенные свойства Определяют группу параметров компонентов
Font Вложенные свойства Шрифт отображения содержимого ячеек

В следующей таблице описаны параметры свойства Options компонента.

Свойство Тип данных Описание
goFixedVertLine Логический Вертикальные разделительные линии между «фиксированными» ячейками
goFixedHorzLine Логический Горизонтальные разделительные линии между «фиксированными» ячейками
goVertLine Логический Вертикальные разделительные линии между всеми ячейками
goHorzLine Логический Горизонтальные разделительные линии между всеми ячейками
goRangeSelect Логический Включение режима выделения диапазона ячеек таблицы
goDrawFocusSelected Логический Дает возможность закрашивания ячейки с фокусом
goRowSizing Логический Дает возможность менять высоту строк с помощью мыши
goColSizing Логический Дает возможность менять ширину столбцов с помощью мыши
goRowMoving Логический Дает возможность перемещать строку с помощью мыши
goColMoving Логический Дает возможность перемещать столбец с помощью мыши
goEditing Логический Управляет режимом редактирования содержимого ячейки
goTabs Логический Управляет режимом перехода табуляцией: при True фокус будет смещаться на следующую ячейку, при False — на следующий компонент
goRowSelect Логический Дает возможность выделять всю строку с «фокусированной» ячейкой
goAlwaysShowEditor Логический Если True содержимое ячейки при фокусе сразу будет доступно редактированию, а при False — сначала нужно щёлкнуть по ячейке мышкой
goThumbTracking Логический Мышкой будет вызываться немедленное перемещение ячеек, а при False — ячейки будут перемещаться только при отпускании скрола

Примеры операций с компонентом Delphi StringGrid

Назначения размера таблицы:

Программный ввод данных в ячейки таблицы:

MyStringGr >’Мой текст’ ;

здесь значения: 1 – номер столбца, 2 – номер строки.

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

MyStringGr >’Мой текст’ ;

var
i : Integer;
begin
for i := 0 to MyStringGr >do
MyStringGr >
end ;

Выделение отдельной ячейки:

MyStringGr >// столбец
MyStringGr >// строка

Программное управление групповым свойством Options:

// Включение редактирования, другие параметры без изменений
MyStringGr >

// Выключение редактирования, другие параметры без изменений
MyStringGr >

// Указывается список включенных параметров, остальные выключены
MyStringGr >

Очистка всех ячеек может быть выполнена по столбцам, строкам или по отдельным ячейкам:

// по столбцам
var
i : Integer;
begin
for i := 0 to MyStringGr >do
MyStringGrid.Cols[i].Clear;
end ;

// по строкам
var
i : Integer;
begin
for i := 0 to MyStringGr >do
MyStringGrid.Rows[i].Clear;
end ;

// по отдельным ячейкам
var
i, j: Integer;
begin
for i := 0 to MyStringGr >do
for j := 0 to MyStringGr >do
MyStringGr ;
end ;

Работа с сеткой DBGrid

Мы с вами уже неоднократно применяли этот компонент для вывода на экран информации из наборов данных в виде таблицы. Однако этот компонент способен на большее. Профессиональные программы отличаются большим набором дополнительных возможностей для пользователя. В этой лекции мы и поговорим о дополнительных возможностях сетки DBGrid .

Как мы уже знаем, строки сетки DBGrid соответствуют записям подключенного набора данных, а столбцы — полям. Свойство DataSource содержит ссылку на выбранный набор данных. Изменяя эту ссылку во время работы программы, можно изменять выводимые в сетке данные, отображая то одну, то другую таблицу (или запрос ) в одной сетке DBGrid .

Столбцы DBGr >Столбцы содержат значения полей подключенного к сетке набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Нам уже приходилось это делать в редакторе полей набора данных, однако, это не всегда оправдано — один набор данных может использоваться в различных местах приложения, в различных формах и на различных сетках. Изменение свойств полей набора данных в этом случае коснется и всех сеток DBGrid , которые подключены к нему, а это требуется далеко не всегда. Более разумным вариантом будет добавление всех полей в редактор полей набора данных, а изменение их свойств можно сделать в каждой сетке по -своему.

Если не пользоваться редактором столбцов самой сетки, DBGrid будет выводить значения по умолчанию — будут выведены все поля набора данных, а заголовки столбцов будут соответствовать именам полей. Но стоит только добавить в редактор столбцов хоть один столбец, и сетка DBGrid будет отображать только его. Таким образом, мы можем показывать только те столбцы, которые действительно необходимы.

Создайте новое приложение . Свойству Name формы, как всегда, присвойте значение fMain, свойству Caption — «Изучение свойств DBGrid «. Проект сохраните в отдельную папку, модулю дайте имя Main , а проекту в целом — MyDBGrid . В эту же папку скопируйте базу данных ok. mdb из прошлой лекции. На форме нам понадобятся сетка DBGrid с вкладки Data Controls , с вкладки ADO компоненты ADOConnection и ADOTable, с вкладки Data Access — компонент DataSource. Также для красоты и удобства можно добавить компонент DBNavigator.

Из прошлых лекций вы знаете, как подключить к базе данных компонент ADOConnection, а затем подключить к нему таблицу ADOTable. В свойстве TableName таблицы выберите таблицу LichData , и откройте ее. Компонент DataSource подключите к нашей таблице, а сетку DBGrid и навигатор DBNavigator — к DataSource. В результате у вас должна получиться простая форма с сеткой и навигатором по ней, в которой отображаются все поля таблицы LichData :

Допустим, в нашем проекте нам нужны не все поля таблицы, а только некоторые из них. Значит, придется поработать с редактором столбцов сетки DBGrid . Вызвать редактор можно тремя способами: дважды щелкнуть по сетке; щелкнуть правой кнопкой по сетке и в контекстном меню выбрать команду Columns Editor и, наконец, щелкнув дважды по свойству сетки Columns в Инспекторе Объектов:

Работа с этим редактором очень похожа на редактор полей набора данных, но есть и отличия. В верхней части окна вы видите четыре кнопки, слева — направо:

  1. Add New (Добавить новый столбец).
  2. Delete Selected (Удалить выделенный столбец).
  3. Add All Fields (Добавить все столбцы из набора данных).
  4. Restore Defaults (Восстановить значения по умолчанию для выделенного столбца).

Если столбцов в редакторе нет, то сетка отображает все поля НД. Добавим один столбец. Для этого нажмем первую кнопку. Сразу же все поля НД исчезли, а сетка отображает пустой столбец. Выделим его в редакторе столбцов, а в Инспекторе объектов в свойстве FieldName выберем поле «Фамилия». Сразу же столбец отобразит это поле . Заголовок столбца будет соответствовать названию поля. В нашей БД имена полей мы задавали русскими буквами, однако это бывает не всегда, особенно если вы работаете с таблицами Paradox или клиент-серверными БД . В этом случае названия полей будут выводиться латиницей, а это не удобно для пользователя. Изменить параметры заголовка столбца можно в раскрывающемся свойстве Title , которое имеет ряд собственных свойств:


Alignment — свойство устанавливает выравнивание заголовка и может быть taCenter ( по центру), taLeftJustify ( по левому краю) и taRightJustify ( по правому краю). По умолчанию, заголовок выровнен по левому краю.

Caption — свойство содержит текст, который отображается в заголовке столбца. Если поле НД имеет имя латинскими буквами, именно здесь можно отобразить его кириллицей.

Color — цвет заголовка, по умолчанию это свойство равно clBtnFace, что обеспечивает стандартный серый цвет. Если вы желаете украсить программу, можете выбрать другой цвет.

Font — шрифт заголовка. Если дважды щелкнуть по этому свойству, откроется диалоговое окно , в котором можно изменить шрифт , начертание, размер и цвет шрифта. То же самое можно сделать, если раскрыть это свойство и непосредственно изменять нужные свойства.

Надо заметить, что свойства Font, Alignment и Color внутри свойства Title меняют шрифт , выравнивание и цвет фона только заголовка столбца, а не его содержимого. Но у столбца имеются эти же свойства, они меняют шрифт , выравнивание и цвет фона выводимых в столбце данных.

Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину. О других свойствах поговорим чуть позже.

Добавьте в сетку другие поля НД: «Имя», «Отчество», «Пол» и «Военнообязанный».

Обратите внимание, что перетаскивая мышью столбцы в редакторе столбцов, вы можете менять их порядок в сетке. Пользователь же имеет возможность менять их порядок, перетаскивая мышью заголовки столбцов.

У сетки DBGrid имеется свойство Columns , которое содержит столбцы. Щелчок по этому свойству как раз и откроет редактор столбцов сетки. Столбцы хранятся в свойстве Items в виде массива и имеют индексы от 0 до DBGrid1.Columns.Items.Count-1 . Заметим, что свойство Items используется по умолчанию, и его можно не указывать:

Шрифт и цвет можно менять не только в Инспекторе объектов, но и программно. Добавим на форму две кнопки, на которых напишем » Шрифт » и «Цвет». А также два диалога: FontDialog и ColorDialog. Создадим процедуру нажатия на первую кнопку и впишем в нее следующее:

Здесь вначале мы свойству Font диалога FontDialog присвоили тот же шрифт , который был в текущем столбце сетки. Затем вызвали выбор диалога, и если пользователь выбрал другой шрифт (название, начертание, размер, цвет шрифта), то изменяем шрифт всего столбца на выбранный пользователем. Аналогичным образом меняем и цвет столбца. Создайте процедуру обработки второй кнопки, и впишите код:

Сохраните проект, скомпилируйте его и проверьте работу кнопок. И шрифт , и цвет текущего столбца будут меняться:

Следует заметить, что таким образом можно менять параметры не только содержимого текущего столбца, но и его заголовка, если, например, вместо

.NET Remoting: программим системы распределенных grid-вычислений

Содержание статьи

При правильном подходе к распределению трудоемкой задачи между имеющимися
вычислительными мощностями экономятся время (деньги), ресурсы, а для кого-то и
нервные клетки. Именно для этого предназначена система распределенных
вычислений, созданием и организацией которой мы займемся в этой статье.

Сети распределенных вычислений впервые нашли свое применение в науке.
Моделирование сложных процессов, обработка большого объема данных и тому
подобные задачи требуют вычислительных мощностей, которые зачастую не способны
предоставить суперкомпьютеры. При этом здесь мы не затрагиваем финансовую
составляющую. Как альтернативу огромным вычислительным комплексам ученые решили
взять «с миру по нитке», и сейчас мы можем наблюдать продукты их побочной
деятельности: начиная от обычных кластеров и заканчивая ботнетами, которые, в
подавляющем большинстве случаев, используются в корыстных целях. Но тема
бот-сетей в нашем журнале была раскрыта неоднократно, как в виде конкретных
примеров работающих ботов, так и в виде концептов. Наша задача — рассмотреть
«светлую» сторону систем распределенных вычислений, при этом абстрагируясь от
типа решаемой задачи (будь то поиск внеземных цивилизаций, лекарства от эпидемии
нового вируса или хэша от «непреступной» комбинации символов). По этой причине
мы не будем скрывать клиентскую часть нашей системы на компьютерах
пользователей. Антивирусы и файрволы мы обходить также не планируем, что, тем не
менее, не приведет к упрощению нашей задачи.

Закладываем фундамент

Традиционно, прежде чем приступить к кодингу, необходимо ознакомиться с
теоретической частью вопроса. В нашем случае теория проста до безобразия. Что, к
сожалению, не мешает ей скрывать некоторые подводные камни. Обо всем по порядку.

Грид-вычисления (от англ. «grid» — сеть, решетка) — форма распределенных
вычислений, в которой группа компьютеров, объединенных каналами связи (кластер),
выполняет большой объем работ. В свою очередь, сеть этих компьютеров называется
«грид». Данный тип сетей в настоящее время нашел свое применение в коммерческой
инфраструктуре для решения таких трудоёмких задач, как экономическое
прогнозирование, сейсмоанализ, разработка и изучение свойств новых лекарств.
Спускаясь с облаков на землю, скажу, что и хакеры данной технологии находят
множество применений.

Ни для кого не секрет, что современные системы авторизации (например,
встроенные в операционную систему или находящиеся на сайте) хранят пароли
пользователей в виде так называемых «хешей» — строк фиксированной длины,
соответствующих паролю. При осуществлении авторизации переданная комбинация
символов отображается в хэш и сверяется с хешем, хранящимся в базе системы.
Хранение паролей в виде хешей отчасти гарантирует их бесполезность в руках
хакера, получившего доступ к базе. Ему ничего не остается, кроме как «в лоб»
перебирать все возможные комбинации символов и сверять их хэши с целевым, то
есть, искать коллизию. При высокой «стойкости» пароля, то есть при сложной (с
математической точки зрения) комбинации символов, шанс подобрать заветную
комбинацию символов за актуальное время стремится к нулю. По крайней мере, на
одном компьютере ;). А если распределять задачу на несколько машин, то время
перебора будет сокращаться пропорционально количеству рабочих станций. Самое
время вспомнить о завалявшихся дедиках (dedicated servers) из прошлогодней
коллекции ;).

В качестве типа хэшей, который мы будем «потрошить», выберем MD5, в силу его
распространенности в веб-инфраструктуре, но хочу напомнить, что нам важна не
задача, а важен процесс ее выполнения. А теперь приступим к выбору инструмента.

Зачем скальпель? Тащи кран!

В нашем журнале неоднократно рассказывалось о прелестях программирования под
платформу Microsoft .NET на разработанном специально для нее языке C#. С
нововведениями MS программирование все больше стало напоминать процесс сбора
конструктора, а справочник MSDN – отличной инструкцией к его сборке.

В качестве инструмента для разработки программного обеспечения относительно
больших масштабов и распределенной архитектуры, .NET окажется как нельзя кстати.
Причина — не только в скорости разработки приложений и внесения изменений в код,
относительной мультиплатформенности и простоте создания сервисов и «облачного»
ПО. Помимо всего перечисленного, в рамках .NET специалисты Майкрософт
разработали множество мелких технологий, полезность которых осознаешь
непосредственно в боевых условиях. Мы рассмотрим одну из таких технологий,
получившую название .NET Remoting. Очень удивил тот факт, что в огромном
количестве клиент-серверных приложений, написанных на C#, до сих пор
используются сокеты, полезность которых заметна в специфичном программном
обеспечении, ориентированном на работу с сетью (сниферы, анализаторы пакетов,
работа с портами и т.п.).

Ремоутинг, в свою очередь, освобождает программиста от возни с сокетами,
открывая широкие возможности для организации распределенной вычислительной
среды.

Что нам стоит грид построить?

Для начала, разберемся в устройстве сети, посмотрев на соответствующую
картинку.

Система имеет в основе клиент-серверную архитектуру с, так называемым,
«толстым» клиентом — то есть, клиентская часть берет на себя все необходимые
данные для расчетов у сервера и затем обращается к нему только с определенным
результатом. Задача сервера: корректно обработать запросы клиентов и
синхронизировать имеющиеся данные между ними, при этом правильно выводя
результаты администратору сети. То есть, нам. Тем, кто уже приступил к созданию
сокета и формированию пакета для отправки, я с радостью продемонстрирую
технологию .NET Remoting в действии.

При первом запуске серверной части систему требуется создать и
зарегистрировать канал на определенном порту (в качестве примера используем порт
с номером 39993), а также зарегистрировать класс для удаленной активизации, то
есть — для предоставления этого класса клиентам. В этом как раз заключается суть
«Ремоутинга»: клиент создает у себя экземпляр класса, который расположен на
удаленном сервере, и работает с этим экземпляром, как со своим. Особо
внимательный читатель заметит, что это, по своей сути, сервис: серверная часть
может предоставлять вычислительные ресурсы своим клиентам, а те, в свою очередь,
получают лишь результаты расчетов. В нашем случае все происходит с точностью до
наоборот: сервер должен использовать результаты работы клиентов. Разработчики
Microsoft таким образом стерли грань между клиентской и серверной частями: любой
объект становится общедоступным и методы, принадлежащие ему, могут выполняться
на любой из сторон. Применительно к нашему случаю: все вычисления, которые
осуществляются в объектах класса, выполняются на сервере, а клиенту передаются
лишь результаты этих расчетов. Вся эта система работает через прозрачный,
невидимый для программиста, прокси-сервер.

//создать и зарегистрировать канал на порту 39993
TcpServerChannel channel=new TcpServerChannel(39993);
ChannelServices.RegisterChannel(channel);
//зарегистрировать класс для удаленной активизации
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Bot),//регистрируемый класс
«Bot»,//URI регистрируемого класса
//режим активизации для каждого клиентского вызова
WellKnownObjectMode.SingleCall);

URI, он же Uniform Resource Identifier (унифицированный идентификатор
ресурса) – параметр, который используется клиентом для активизации объекта: с
помощью URI клиент укажет серверу, что требуется экземпляр класса Bot.

Клиент, в свою очередь, должен создать клиентский канал и зарегистрировать
удаленный класс в локальном домене:

//создать и зарегистрировать клиентский канал
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel);
//зарегистрировать удаленный класс в локальном\n домене
RemotingConfiguration.RegisterWellKnownClientType(
typeof(Bot),//удаленный класс
//URI удаленного класса
«tcp://localhost:39993/Bot»);

Здесь URI задает местоположение удаленного класса. Протокол (в данном случае,
TCP) соответствует протоколу каналов, зарегистрированных в доменах приложений.
Идентификатор машины (localhost, но в реальных условиях — IP-адрес или имя
компьютера) задает сервер, экспортирующий класс Bot и таким образом указывает
компьютер, на котором будет создан объект. Далее в строке URI через двоеточие
указывается номер порта, на котором сервер ожидает вызовы (в нашем случае, порт
с номером 39993).

И напоследок: для того, чтобы класс Bot поддерживал удаленное взаимодействие,
необходимо использовать в качестве базового класса System.MarshalByRefObject:

public class Bot:MarshalByRefObject
<

>

Кто не работает — тот завис

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

Bot brain = new Bot();

Далее работа с объектом brain будет происходить, как с локальным, но при этом
все расчеты, которые выполняются в классе этого объекта, будут производиться
сервером.

Как не странно, наша система распределенных вычислений должна грамотно
распределить (простите за тавтологию) задачу между ресурсами клиентов. Напомню,
что задачей у нас является диапазон всевозможных комбинаций символов, из
которых, по мнению пользователя (он определяет алфавит, на основе которого
генерируется диапазон), может состоять пароль.

Пусть каждая рабочая станция в нашей грид-сети сама определит диапазон строк,
который она сможет перебрать за адекватное время. «Предпочтения» рабочей станции
мы будем определять с помощью частоты процессора и количества ядер
(процессоров):

//кол-во ядер
int Core=(Int32)System.Environment.ProcessorCount;
//тактовая частота (МГц)
int Takt=(Int32)Registry.GetValue(
@»HKEY_LOCAL_MACHINE\n\HARDWARE\DESCRIPTION\System\Cen tralProcessor»,
«

Составим простейшую функцию, в результате работы которой получится число,
равное числу строк (диапазон) для нашего клиента:

int RangeValue = Core * Takt * 9; //функция для расчета диапазона

Изменяя значение третьего коэффициента, мы будем изменять среднее время
перебора адекватного (установленного на основе моих экспериментов) диапазона
строк.

Процесс перебора состоит из трех простых шагов:

  1. Чтение строки из диапазона;
  2. Генерация хеша текущей строки;
  3. Сравнение сгенерированнго хеша с целевым хешем. Если равны – отправить
    результат (строку) серверу в виде сообщения о найденном пароле. Если не
    равны – выполнить шаги 1-3;
  4. В случае конца диапазона отправить результат взять новый диапазон для
    перебора или завершить работу.

Код, выполняющий перебор, здесь рассматривать не будем, так как и он и
подробные комментарии к нему ждут тебя на
диске.

Товарищ командир

Несмотря на тот факт, что сервер в «распределенке» является одной из
важнейших ее частей, самый трудный этап реализации уже позади. Так уж
получилось, что «толстый» клиент оказался еще и «умнее» сервера: и ширину
диапазона для себя он определяет и пароль брутит. Однако на серверную часть
ложатся не менее ответственные задачи генерации строк и учета перебранных
диапазонов. Не углубляясь в технические детали, опишу процесс генерации
диапазонов строк.

Администратор сети определяет множество символов, которые составляют алфавит
для генерации строк. Например, в роли алфавита могут быть спецсимволы, цифры,
комбинация «abcde39#» и тому подобные комбинации символов. Далее происходит
взаимооднозначное соответствие между строкой алфавита и множеством чисел (строке
«!zxcv4M» соответствует множество «1234567»). Серверная часть работает со
строкой символов как с n-мерной системой счисления, то есть при генерации новой
строки происходит инкрементация текущего числа на 1. Прикладная математика может
быть полезной ;).

Весь функционал серверной части предоставляется клиентам в методах удаленного
класса Bot. Рассмотрим метод GetJob(int ). Если
клиенту потребуется получить задание, достаточно в уже созданном объекте brain
вызвать метод GetJob:

Таким образом, отправляется запрос серверу, который начинает выполнять
команды, содержащиеся в методе. Результат выполнения отправляется клиенту,
который использует полученные данные на свое усмотрение.

Будущее рядом, но не всем доступно

Становятся заметны перспективы создания «облачных» приложений: например игр с
потрясающей графикой, расчет элементов которой полностью ложатся на сервер, а
клиенты лишь выводят игроку результаты в виде красивой картинки на экран
монитора.

В частности, разработанная нами система может оказаться полезной, когда
очередной хэш не находится ни в одном из онлайн-хранилищ «слепков» паролей, а
так же не поддается Джону Потрошителю a.k.a John the Ripper. Для таких случаев
каждый уважающий себя взломщик/pen-тестер/security-консультант (нужное
подчеркнуть) должен иметь в своем инструментарии приложение, реализующее
распределенные вычисления.

Кстати, раз уж мы упомянули сервисы «всуе», то почему бы не сделать из нашей
сети сервис, который будет полезен не только нам, но и другим пользователям?
Только представь: отчаявшийся хэш-крэкер заходит на наш сайт, вбивает в формочку
неприступный хеш (номер кошелька ;)) и ждет результатов, зависящих только от
масштабов нашей сети. Нам даже не нужно трогать клиентскую часть: достаточно
доставить серверу любым из способов целевой хэш, а дальше он «разберется»
самостоятельно. Звучит заманчиво, а ведь это только распределенка, выполняющая
брут MD5-хешей. Трудно представить, сколько еще задач ждут своего распределения!

Компоненты pfsgrid net таблица с множеством поддерживаемых функций

Компонент PFSGrid представляет аналог стандартного компонента ListBox, но обладающего несравненно большими возможностями. В частности, предусмотрена динамическая раскраска ячеек в зависимости от значений, редактирование содержимого ячеек, изменение положения строк и столбцов путем «перетаскивания» их на другое место и многое другое. На основе компоненты можно создавать удобные окна настройки параметров, информационные панели, редакторы таблиц и пр. Каждая ячейка способна хранить не только данные, но и описание этих данных, благодаря чему в режиме редактирования отображаются соответствующие экранные элементы.

Возможности:

  • Редактирование значений в ячейке
  • Широкий спектр поддерживаемых типов данных в ячейке с автоматическим выбором элемента редактирования в зависимости от типа данных в ячейке.
  • Индивидуальная настройка каждой ячейки (редактирование, отображения)
  • Изменение мышью ширины столбцов
  • Перестановка мышью (Drag-and-drop) строк и столбцов
  • Быстрая сортировка по любому столбцу.
  • Возможность объявления любого компаратора для сортировки + три предопределенных компаратора
  • Различные стили линий, отображение только горизонтальных, вертикальных или полной сетки.
  • Отделенный уровень представления от внутренней логики, что позволяет использовать одну таблицу на разных панелях.
  • Динамическое изменение цветов фона, текста, отображение соответствующих пиктограмм (стрелочки вверх/вниз) при изменении числовых величин.
  • Встроенное меню видимости колонок.
  • Черезстрочная подсветка, выделение строки, подсветка строки и столбца под курсором мыши и многое другое…

Общее описание таблицы.

Общий вид таблицы показан на рис. 1

Редактирование значений.

Как уже было сказано выше, каждая ячейка описывает с помощью объекта DynamicProperty 1 определенный элементарный тип данных. Соответственно, в зависимости от этого типа определяется экранный элемент, который будет отображен для этой ячейки во время редактирования. Для редактирования необходимо щелкнуть один или два раза по ячейке (в зависимости от флага EnableOneClickEditing)мышью. После этого на месте ячейки будет отображен элемент редактирования значения. При нажатии Enter редактирование завершается с принятием изменений. При нажатии ESC редактирование завершается без принятия изменений. Если был установлен флаг EnableOnUpdateValue, то любое изменение значения в экранном элементе будет сразу присвоено ячейке. Редактирование текущей ячейки автоматически завершиться, если пользователь перейдет к редактированию другой ячейки без завершения редактирования текущей. При этом принятие изменений зависит от флага EnableAutoApply. Если присвоить этому флагу значение true, то в описанном случае значение текущей ячейки будет обновлено, в противном случае останется без изменений.

Редактирование строковых величин.

Во время редактирования строковых значений (типа DynamicPropertyType.String) в ячейке появляется поле ввода текста (см. рис. 2.)

Для того, чтобы дать пользователю возможность выбрать несколько строковых значений, необходимо для объекта DynamicProperty данной ячейки установить свойство Variants, представляющее собой массив строк-вариантов значений. В данном случае на экране будет отображен выпадающий список (рис.3). Установка EnableEditVariants динамического свойства в true включает для выпадающего списка возможность вручную редактировать текст. В противном случае значение строки может быть выбрано только из представленного списка.

Редактирование чисел

Редактирование числовых величин осуществляется специальным полем ввода. (см. рис. 4)

Рис. 4. Поле ввода числовых величин. Редактируется вещественное число.


При этом изменение величины возможно с помощью пиктограмм со стрелками, а также колесиком прокрутки мыши. Приращение величины при изменении ее с помощью стрелок и колесика мыши определяется свойством Increment объекта DynamicProperty.

Редактирование булевых величин

Если ячейка описывает булевый тип, то в ней появляется пиктограмма «флажка» (рис. 5.) Для редактирования значения экранный элемент не используется, просто изменяется состояние пиктограммы в зависимости от значения ячейки.

Рис. 5. Булевая величина в ячейке.

Редактирование стилей линий

При редактировании стиля линии в ячейке отображается список выбора стиля линии.

Рис. 6. Редактирование стиля линии.

Редактирование цветов

Если ячейка описывает цвет, то для редактирования используется список выбора цвета (рис. 7. )

Редактирование толщины линий

Если ячейка описывает толщину линий, то для редактирования используется список выбора толщины линии.

Рис. 8. Список выбора толщины линии.

Редактирование рисунков

Если ячейка описывает рисунок (точнее индекс рисунка), то для редактирования используется список рисунков. Список рисунков формируется на основании массива описания рисунков Images[] объекта DynamicProperty.

Редактирование имени файла

Если ячейка описывает имя файла, то для редактирования используется метка выбора имени файла:

При этом нажатие кнопки «…» открывается стандартное диалоговое окно выбора имени файла. При нажатии кнопки «Х» имя файла сбрасывается в пустую строку.

Редактирование имени шрифта

Если ячейка описывает шрифт, то в режиме редактирования появляется метка выбора шрифта.

При нажатии на кнопку «…», открывается стандартное диалоговое окно выбора имени шрифта. Редактирование завершается с общем порядке.

Редактирование даты и времени.

Если ячейка описывает дату, или время, то в режиме редактирования появляется элемент выбора даты или времени:

Режим кнопки

Если ячейка описывает кнопку, то в режиме редактирования на ее месте появляется кнопка. (Рис. 13)

Изменение видимости колонок

Видимость колонок изменяется с помощью контекстного меню, которое вызывается при щелчке правой кнопкой мыши по заголовку таблицы. Видимые колонки в этом меню будут отмечены флажками, кроме того, название колонки, ко заголовку которой произошел щелчок, будет выделен полужирным шрифтом. (Рис. 14.)

Рис. 14. Изменение видимости колонок.

Изменение ширины столбцов и сортировка

Ширина колонки изменяется с помощью мыши. Для этого нужно установить курсор на границу колонок, нажать левую кнопку и не отпуская ее, растянуть или сжать колонку. Курсор мыши при попадании на границу колонок меняет свой внешний вид.

Сортировка происходит при щелчке левой кнопкой по заголовку нужной колонки. При этом, сортировка произойдет только в том случае, если у заголовка есть компаратор (Свойство Comparer не сброшено в null). Направление сортировки выбирается автоматически, исходя из состояния поля LastSortState заголовка. Если это поле было установлено в SortNothing или в SortAscending, то сортировка будет выполняться по возрастанию, в противном случае, при значении поля SortDescending сортировка будет выполнена по убыванию. После сортировки значение поля меняется автоматически на противоположное, т.е. при значениях SortNothing или SortAscending после сортировки поле будет иметь значение SortDescending, а при значении SortDescening после сортировки поле будет иметь значение SortAscending. Для остальных колонок поле LastSortStrate будет установлено в SortNothing. Таким образом можно определить колонку и направление последней сортировки.

Перетягивание колонок и столбцов.

Для перетягивания строки или столбца необходимо щелкнуть по заголовку колонки или строке левой кнопкой мыши и «перетащить» ее на новое место, не отпуская кнопки. При этом место вставки строки или столбца будет отмечаться черным обрамлением (см. рис)

Перетягивание колонки разрешено только если установить свойство ColumnDragEnable в true. Перетягивание строк возможно только при установке свойтсва RowDragEnable в true.

Описание классов библиотеки.

Программная модель компоненты PFSGrid.

Таблица содержит два основных свойства: заголовок (PFColumnCollection) и коллекцию строк (PFItemCollection). Заголовок определяет количество столбцов. Каждый столбец описывается заголовком (PFColumn). Все строки, которые добавляются в коллекцию строк, должны иметь количество ячеек, равное количеству столбцов. В противном случае возникнет исключение. Каждая строка (PFItem) имеет коллекцию ячеек (PFSubItemCollection). Каждая ячейка (PFSubItem) имеет объект – динамическое свойство (DynamicProperty), которое описывает величину, хранимую данной ячейкой.

Динамические свойства.

Динамическое свойство

Динамическое свойство представляет собой класс, способный описывать несколько самых распространенных элементарных типов данных. Каждая ячейка таблицы связана с динамическим свойством. В зависимости от того что описывает этот объект, в ячейке отображается соответствующая информация, кроме того, при редактировании ячейки таблица сама устанавливает необходимый экранный элемент, подходящий для этого свойства. В настоящей версии таблицы динамическое свойство поддерживает около десятка элементарных типов, таких, как целые и вещественные числа, строки и логические величины, а также структуры типа Color, DashStyle или DateTime. Кроме того, есть более узкая специализация, например имя файла или толщина линии. Эти свойства в своей основе базируются на элементарных типах string или int, но в ячейках отображаются иначе, как в обычном режиме, так и в режиме редактирования.

PFS.GUI.Controls.PFSGrid.DynamicProperty Динамическое свойство.
Конструктор
DynamicProperty (Object[] par) Параметрический конструктор. Количество аргументов зависит от того, какую величину описывает динамическое свойство и от самого свойства. При этом минимальное количество аргументов — 0 иначе свойства устанавливаются по умолчанию. Порядок аргументов: «par[0]»> (object) — Значение свойства «par[1]»> (DynamicPropertyType) Тип свойства «par[2]»> (string) Имя свойства «par[3]»> (decimal) Минимальное значение для чисел «par[4]»> (decimal) Максимальное значение для чисел «par[5]»> (int) Число знаков после десятичной точки «par[6]»> (decimal) Инкремент для вещественных чисел «par[7]»> (string) Группа, к которой принадлежит данный свойтсво «par[8]»> (bool) Возможность изменения данного динамического в выпадающем списке, во время редактирования ячейки таблицы
Методы
Название Описание
Void SetProperty (Object prop_val, DynamicPropertyType prop_type) Установить значение динамического свойства
String ToString() Строковое представление динамического свойства
DynamicProperty.GetClone() Получение глубокой копии динамического свойства — не клонируется только список рисунков
DynamicProperty CreateProperty (Object prop_value, DynamicPropertyType prop_type, String prop_name, String prop_group) Создание динамического свойства по основным параметрам
DynamicProperty CreateProperty (Object prop_value, DynamicPropertyType prop_type, String prop_name, String prop_name, Boolean prop_visible) Создание динамического свойства по основным параметрам
Свойство
Название Описание
String[] Variants Ссылка на массив с вариантами значений. Если эта ссылка не обнулена, то вместо текстового поля ввода в режиме редактирования будет показан выпадающий список.
Bool EnableEditVariant Разрешить редактирование вариантов Если установить это свойство в true, то выпадающий список позволит ввести свое значение, в противном случае, строковая величина может быть выбрана только из списка.
PFSImageItem[] Images Список пиктограмм, которые будут выводиться в выпадающий список в режиме редактирования. Это свойство имеет смысл, когда объект DynamicProperty описывает пиктограмму.
FileTypes[]FileTypes Список допустимых расширений файлов. Это свойство имеет смысл, когда объект DynamicProperty описывает имя файла
Decimal Minimum Минимальное значение только для числовых величин. По умолчанию устанавливается в MinInteger(4 байта знаковое).
Decimal Maximum Максимальное значение только для числовых величин. По умолчанию устанавливается в MaxInteger(4 байта знаковое)
Int32 DecimalPlaces Число знаков после точки. Имеет смысл только когда объект DynamicProperty описывает вещественное число. По умолчанию свойство равно 0.
Decimal Increment Инкремент. Имеет смысл только для объектов DynamicProperty, которые описывают вещественное число. Этот инкремент используется во время редактирования ячейки в таблице. По умолчанию — 1.
DynamicPropertyType PropertyType Тип, который описан объектом DynamicProperty. По умолчанию, объект описывает целое со знаком (Integer).
Object PropertyValue Значение свойства. По умолчанию целое и равно нулю.
LineStyles LineStyles Стиль линий в выпадающем списке выбора стиля линии. Пакет стилей линий определяется классом LineStyles.
String PropertyName Имя свойства. По умолчанию — пустая строка
String PropertyGroup Группа, к которой принадлежит данное динамическое свойство. По умолчанию – пустая строка.
Bool PropertyVisible Отображать или не отображать данное динамическое свойство в окне настроек. (Это универсальное окно на основе компонента PFSGrid)
Bool Enabled Активность данного динамического свойства в списках окна настроек. По умолчанию объект DynamicProperty позволяет активность.
Список динамических свойств.

Данный класс группирует несколько объектов типа DynamicProperty, обеспечивая внутреннюю индексацию, и упорядочивание.

PFS.GUI.Controls.PFSGrid.DynamicPropertyList Список динамических свойств. Список не синхронизирован. Поддерживает глубокое копирование (Клонирование)
Методы
Название Описание
Void Add(DynamicProperty property) Добавление объекта DynamicProperty в список. Если ссылка на этот экземпляр уже присутствует в списке, то метод ничего не добавляет.
Void Remove(DynamicProperty property) Удалить объект DynamicProperty из списка. Если такого параметра в списке нет, то ничего не происходит.
Void RemoveAt(Int32 index) Удалить объект DynamicProperty по индексу в списке. При этом, если индекс вышел за границы допустимых значений – ничего не происходит.
Void Clear() Удалить все объекта DynamicProperty из списка.
DynamicProperty[] GetGroupArray(String group_name) Получить массив со ссылками на все объекты DynamicProperty, которые принадлежат конкретной группы. В качестве параметра метод получает название группы.
String[] GetGroups() Метод вернет массив строк, содержащий названия всех групп, которые присутствуют в данном списке.
Int32 IndexOf(DynamicProperty property) Получить индекс объекта DynamicProperty в списке. При этом, если такой объект не найден, метод вернет -1.
DynamicPropertyList GetClone() Получение списка – клона текущего.
Void CopyTo(DynamicPropertyList destination) Производит глубокое копирование текущего списка в список dеstination.
Void Copy (DynamicPropertyList source, DynamicPropertyList destination) Статический метод. Глубокое копирование одного списка в другой.
Свойства
Название Описание
Int32 Count Количество объектов DynamicProperty в списке.
Int32 GroupCount Количество групп в списке.
Int32 MaxGroupCount Максимальное количество объектов DynamicProperty, принадлежащих к одной группе.
DynamicProperty Item(Int32 index) Доступ к объекту DynamicProperty по индексу. Доступно только для чтения
DynamicProperty Item(String name) Доступ к объекту DynamicProperty по имени. Доступно только для чтения

Таблица.

Базовая таблица.
PFS.GUI.Controls.PFSGrid.BaseGrid Базовая таблица. Служит только для отображения информации
Методы
Название Описание
Int32 GetHeaderHeight() Возвратит высоту заголовка независимо от значения свойства HeaderVisible
Void SetHeaderHeight(Int32 height) Задаст высоту заголовка независимо от значения свойства HeaderVisible и режима работы
Void SortColumn(Int32 col_number) Сортировка по колонке. Если у данной колонки отсутствует компаратор, то будет создан общий строковый компаратор.

Направление выбирается автоматически, исходя из состояния свойства LastSortDirection выбранной колонки. Метод после сортировки автоматически переключает это свойство в другое направление, при этом у всех остальных колонок это свойство сбрасывается в неопределенное состояние. Void RevalidateSubItem(PFSubItem sub_item, Bool refresh_all) Вывести на экран только эту ячейку. В качестве параметра принимает на вход ссылку на ячейку и режим перерисовки. Если второй параметр установить в true, то будет перерисована вся таблица, иначе в зависимости от значения свойства DirectDraw будет перерисована только эта ячейка События Название Описание ClickedEventHandler SelectedIndexChanged Произошла смена индекса ClickedEventHandler ColumnClickedEvent Происходит при клике на заголовок колонки ColumnResizeEventDelegate OnColumnResize Происходит при изменении ширины колонки EventHandler OnSort Происходит после сортировки EventHandler OnBeforeSort Происходит непосредственно перед сортировкой DragEventHandler ColumnDrag Событие происходит при перетягивании колонок DragEventHandler RowDrag Событие происходит при перетягивании строк Свойства Названия Описание Bool BackgroundStretchToFit Растянуть рисунок фона на заднем плане на всю таблицу или нет Bool Selectable Возможность выделять строки Bool HeaderWordWrap Переносить текст заголовка, если он не помещается в ячейке. Bool ItemWordWrap Перенос текста в ячейке, если он не помещается Color SuperFlatHeaderColor Цвет фона плоского заголовка таблицы PFControlStyles ControlStyle Стиль заголовков колонок Bool ShowBorder Показывать или нет бордюр Int32 WeelScroll Разрешить или запретить прокрутку содержимого таблицы с помощью колесика мыши Если установить 0, то прокрутка выключена. Число больше нуля — шаг прокрутки при одном щелчке колесика Color SelectedTextColor Цвет текста выбранных строк Color HotTrackingColor Цвет подсветки колонки и строки курсором мыши Bool HotItemTracking Включить или выключить подсвечивание строки курсором Bool HotColumnTracking Включить или выключить подсвечивание колонки курсором Bool ShowFocusRect Показывать обрамление текущей строки Bool AllowColumnResize Разрешить или запретить изменение ширины колонок Bool AutoHeight Автоматическая установка высоты Bool HeaderVisible Видимость заголовка PFColumnCollection Columns Коллекция заголовков колонок PFItemCollection Items Коллекция строк Color SelectionColor Цвет выбранных строк Bool FullRowSelect Выбирать полную строку или нет Bool AllowMultiselect Разрешить выделение нескольких строк Int32 BorderPadding Внутренняя ширина бордюра PFGridLineStyle GridLineStyle Стиль линий сетки PFGridTypes GridTypes Тип сетки PFGridLines GridLines Линии сетки Color GridColor Цвет линий сетки Int32 ItemHeight Высота строк Int32 HeaderHeight Высота заголовка Int32 CellPaddingSize Ширина бордюров ячейки Bool Streakiness Включить чередование строк в таблице. ArrayList SelectedItems Возвращает список выделенных строк ArrayList SelectedIndicies Возвращает список выделенных индексов Int32 HotColumnIndex Номер текущей подсвеченной колонки Int32 HotItemIndex Номер текущей подсвеченной строки PFItem FocusedItem Текущая строка Int32 Count Текущее количество строк в таблице Int32 TotalRowHeight Общая высота всех строк таблицы в пикселах Int32 VisibleRowsCount Количество строк, которые отображаются на экране в текущий момент Int32 MaxHeight Максимальная высота любой строки в пикселах Bool DirectDraw Включение режима рисования прямо на канве при обновлении значения ячейки, или через событие OnPaint с очередью Bool CellEditEnable Разрешить или запретить редактирование таблицы Bool RowDragEnable Разрешить или запретить перетягивание строк в таблице Bool ColumnDragEnable Разрешить или запретить перетягивание столбцов Bool BlockClickOnHeader Блокировать событие Click по заголовку Bool BlockDoubleClickOnHeader Блокировать событие DoubleClick по заголовку Bool ShowColumnVisibleMenu Показывать или прятать меню видимости колонок. Меню появляется при щелчке правой кнопкой по заголовку.

Таблица с расширенными возможностями (редактирование)
PFS.GUI.Controls.PFSGrid.PFSGrid Таблица, унаследованная от базовой. Включены возможности редактирования.
Методы
Название Описание
Void CompleteEditing(Bool apply_changes) Принудительно завершить редактирование ячейки. При этом если передать в качестве параметра true — текущее значения будет принято, в противном случае текущее изменение не принимается. Не рекомендуется вызывать метод внутри конструкций
Bool IsEdited(PFSubItem sub_item) Проверяет, редактируется ли данная ячейка
Void Resort(Bool reverse) Пересортировать таблицу согласно ее последнему состоянию. Если передать true, то таблица будет отсортирована в обратном порядке
События
Название Описание
EventHandler OnBeforeEditCell Происходит перед редактированием значения ячейки
EventHandler OnAfterEditCell Происходит при завершении редактирования ячейки
EventHandler OnValueChange Происходит в том случае, если значение элемента редактирования значения ячейки изменяется, но редактирование ячейки не завершается. Это событие будет вызвано только в том случае, если у ячейки установлен флаг EnableOnUpdateValue
EventHandler OnNumericValueChange Происходит, когда в качестве редактирующего элемента в текущий момент используется числовое поле ввода. При изменении его значения, при этом будут передаваться ссылки на ячейки, для которых это событие произошло.
EventHandler OnTextBoxTextChange Происходит, если текущим элементом редактирования является поле ввода текста. При этом, событие будет происходить при изменении текста, в качестве параметра будет передаваться ссылка на редактируемую ячейку.
EventHandler OnDateTimeChange Происходит, если текущим элементов редактирования ячейки является элемент выбора даты. При этом, событие будет происходить при изменении даты, в качестве параметра будет передана ссылка на редактируемую ячейку.
EventHandler OnComboBoxTextChange Происходит, если текущим элементов редактирования ячейки является выпадающий список. При этом, событие будет происходить при изменении индекса выбранного элемента, в качестве параметра будет передана ссылка на редактируемую ячейку.
Свойства
Названия Описание
XmlNode XmlSettings Xml представление таблицы
Bool IsEditing Признак редактирования ячейки. Не рекомендуется использовать внутри конструкций lock()

Внутреннее представление таблицы.

Заголовок колонки.

Заголовок представляет собой коллекцию заголовков колонок. Заголовок колонок представлен классом PFColumn и имеет свойства и методы, перечисленные ниже.

PFS.GUI.Controls.PFSGrid.PFColumn Заголовок колонки
Свойства
Название Описание
Dictionary Dictionary Словарь для данной колонки. Автоматически пополняется при добавлении строк в таблицу. Данный объект полезен для накопления информации по значениям в колонках при организации фильтров. Внимание! При изменении значения ячеек у строк, уже добавленных в таблицу, обновления информации не происходит!
BaseComparer Comparer Компаратор сортировки для данного столбца. Если равен null, то сортировка по щелчку мыши для этой колонки работать не будет. При этом если запустить сортировку вызовом метода SortColumn таблицы, величины в ячейках сравниваются как строки
Bool Visible Видимость столбца
Int32 ImageIndex Индекс пиктограммы, отображаемой в колонке
System.Windows.Form.ContentAlighment TextAlignment Выравнивание текста в колонке
SortDirection LastSortState Направление последней сортировки. Задание значения через это свойство вызовет установку этого свойства в состояние SortNothing для остальных колонок.
Int32 Width Ширина колонки
String Text Текст заголовка в колонке
String Name Внутреннее имя колонки. По этому имени работает индексатор коллекции.
ColumnStates State Состояние колонки
Методы
Название Описание
Void SetLastSortDirection (SortDirections direct) Установить свойство LastSortState без корректировки остальных колонок. Это означает, что установка свойства через этот метод не вызовет изменения свойств LastSortState у остальных колонок.
Заголовок таблицы.

Заголовок таблицы представляет собой коллекцию заголовков колонок.

PFS.GUI.Controls.PFSGrid.PFColumnCollection Заголовок таблицы
Методы
Название Описание
Void AddToDictionary(PFItem item) Добавить в словарь значения из строки
Void RemoveFromDictionary(PFItem item) Удалить из словаря значения строки
Void ClearDictionaries() Очистить все словари
Void RollRight(Int32 count) Циклический сдвиг заголовков вправо на count позиций
Void RollRight() Циклический сдвиг заголовков вправо на одну позицию
Void RollLeft(Int32 count) Циклический сдвиг заголовков влево на count позиций
Void RollLeft() Циклический сдвиг заголовков влево на одну позицию
Void MoveRight(Int32 index) Сместить заголовок с индексом index на одну позицию вправо
Void MoveLeft(Int32 index) Сместить заголовок с индексом index на одну позицию влево
Void ShiftMove(Int32 from, Int32 to) Переместить заголовок с позиции from на позицию to cо сдвигом ячеек внутри диапазона [from..to]
Void SimpleMove(Int32 form, Int32 to) Поменять местами ячейки в позициях from и to
Void Int GetColumnIndex(String name) Получить текущий индекс колонки
Void Int GetStartIndex(PFColumn column) Получить начальный индекс колонки. Начальный индекс присваивается заголовку (или колонке) в момент ее добавления в таблицу. При этом в течении жизни таблицы он не меняется. Текущий индекс может быть изменен (либо программным путем, либо через перетаскивание колонки пользователем)
PFColumn GetColumnByStartIndex(Int32 start_index) Получить ссылку на колонку по ее стартовому индексу
Int32 GetColX(Int32 number) Получить сумму ширин всех видимых колонок до колонки с номером number.
Void Add(PFColumn column) Добавить заголовок в коллекцию колонок
Void Add(String name, Int32 width) Добавить заголовок в коллекцию колонок и именем и шириной колонки.
Void Add(String name, Int32, width, System.Windows.Forms.HorizontalAlignment alignment) Добавить заголовок в коллекцию колонок с именем, шириной колонки и выравниванием текста.
Void AddRange(PFColumn[] columns) Добавить пакет заголовков в коллекцию колонок.
Void Remove(PFColumn column) Удалить колонку из коллекции
Void RemoveAt(Int32 index) Удалить колонку из коллекции. В качестве индекса удаления выступает начальный индекс, а не текущее положение колонки в коллекции.
Void Clear() Удалить все колонки из коллекции
Void IndexOf(PFColumn column) Вернуть текущий индекс колонки.
Void ClearStates() Сбросить все состояния колонок (Установка свойств State в csNone)
Void ClearHotStates() Установить в csNone свойства только тех колонок, которые имеют свойство State равное csHot
Bool AnyPressed() Вернет true, если хотя бы одно свойство State установлено в csHot
Свойства
Свойство Описание
PFColumn Item(Int32 index) Индексатор
PFColumn Item(String name) Индексатор по имени колонки
Int32 Width Общая ширина всех колонок
Класс – ячейка таблицы (PFSubItem)
PFS.GUI.Controls.PFSGrid.PFSubItem Класс — ячейка строки таблицы
Методы
Название Описание
Void SetImageIndex(Int32 image_index) Установка свойства ImageIndex без перерисовки таблицы
Void SetImage(Bitmap bitmap) Установка картинки (свойства Image) без перерисовки ячейки
Void SetImageAlignment ( System.Windows.Forms.HorizontalAlignment alignment) Установка свойства ImageAligment без перерисовки таблицы
Void SetTextAligment( System.Drawing.ContentAlignment alignment ) Установка свойства TextAligment без перерисовки таблицы
Void SetProperty (Object prop_value, DynamicPropertyType prop_type) Установить значение динамического свойства ячейки вместе с его типом. Типы передаваемого объекта и описание типа в терминах DynamicPropertyType должны совпадать. При этом значение текста в ячейке также будет изменено.
Void SetProperty(Object prop_value) Установить только значение динамического свойства в ячейке. Тип передаваемого объекта и тип, описанный ячейкой должны совпадать. Вызов метода также изменит значение текста.
Void SetText(String text) Установка текста без перерисовки таблицы
Void SetForeColor(Color color) Установка свойства ForeColor без перерисовки таблицы
Void SetBackColor(Color color) Установка свойства BackColor без перерисовки таблицы
Void SetSelected(Bool selected) Установка свойства Selected без перерисовки основной таблицы
Void SetDecimalPlaces(Int32 decimal_places, Bool refresh) Установить количество знаков после точки при отображении. Имеет смысл только для вещественных чисел.
Void SetNonColoredValue(Decimal val, String text) Задать значение типа decimal и текст без перерисовки таблицы
Void SetNonColoredValue(Decimal val, String text, Bool refresh) Изменить значение типа decimal и текст с обновлением информации в ячейке
Void SetNonColoredValue(Decimal val) Задать значение типа decimal без перерисовки таблицы.
Void SetValue(Decimal val, String text, Bool refresh) Метод введен дополнительно для ProTrader. Метод задает ячейке вещественное значение, но в качестве текста отображается значение параметра appearance.
Свойства
Название Описание
System.Windows.Forms.HorizontalAlignment ImageAlignment Выравнивание пиктограммы внутри ячейки
SetTextAligment(System.Drawing.ContentAlignment TextAlignment Выравнивание текста внутри ячейки
Object Tag Дополнительная информация или связанный с этой ячейкой объект
Bool BeingEdited Признак того, что данная ячейка в данный момент редактируется
String LocalKey Ключ локализации
DynamicProperty Property Описание свойства для редактирования. Режим редактирования для этой ячейки не работает, если это свойство обнулено, или EnableEditing установлено в false
Bool EnabledEditing Разрешить или запретить редактирование ячейки.
Bool EnableOneClickEditing Разрешить или запретить редактирование по одному щелчку. По умолчанию для редактирования ячейки необходимо дважды щелкнуть по ней. При этом, если в этот момент редактировалась какая-нибудь другая ячейка, ее редактирование завершается.
Bool EnableOnUpdateValue Разрешить или изменение значения ячейки при изменении значения элемента редактировании При этом редактирование значения ячейки продолжается.
Bool EnableAutoApply Если установить данный флаг, то изменения в ячейке будут приняты автоматически при завершении редактирования в случае передачи фокуса другой ячейке. Внимание! Если для этой ячейки был установлен флаг EnableOnUpdateValue, то значение ячейки будет изменено, если изменялось значение в элемент редактирования. Таким образом, в этом случае, значение флага EnableAutoApply не имеет смысла.
Object Obj Дополнительный объект, связанный с данной ячейкой.
Int32 ValueCode Номер ячейки в колонке. Устанавливается программой-пользователем. Дополнительно введен в целях оптимизации распознавания ячейки в событиях изменения.
Bool IsButtoned Поле в режиме редактирования будет представлять собой кнопку. При этом, поведение кнопки аналогично поведению любого другого элемента редактирования. Кнопка вызывает событие OnButtonPushed. Значение ячейки в этом случае не меняется.
String Text Текст в ячейке
Color ForeColor Цвет текста в ячейке
Color BackColor Цвет фона в ячейке
Bool Selected Признак принадлежности ячейки к выделенной строке.
Bool EnableArrowing Разрешить или запретить появление стрелок (пиктограмм)
Bool BorderedArrows Пиктограммы с ободком или без
Bool EnableColoring Разрешить изменение цвета ячейки при задании значений.
Color UpBackColor Цвет фона ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел.
Color DownBackColor Цвет фона ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел.
Color NoChangeBackColor Цвет фона ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел.
Color UpForeColor Цвет текста ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел.
Color DownForeColor Цвет текста ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел.
Color NoChangeForeColor Цвет текста ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел.
Decimal Value Числовое значение, задаваемое ячейке. Присвоение числового значения ячейке через это свойств влияет на раскраску ячейки и рисование пиктограмм. При этом, динамическое свойство должно описывать либо целый, либо вещественный тип. В противном случае попытка задать значение приведет к исключению.
Класс – коллекция ячеек.
PFS.GUI.Controls.PFSGrid.PFSubItemCollection Коллекция ячеек
Методы
Название Описание
Void RollRight(Int32 count) Циклический сдвиг строки вправо на count позиций
Void RollRight() Циклический сдвиг строки вправо на одну позицию
Void RollLeft(Int32 count) Циклический сдвиг строки влево на count позиций
Void RollLeft() Циклический сдвиг строки влево на одну позицию
Void MoveRight(Int32 count) Сместить ячейку и индексом count на одну позицию вправо
Void MoveLeft(Int32 count) Сместить ячейку с индексом count на одну позицию влево
Void ShiftMove(Int32 from, Int32 to) Переместить колонку с позиции from на позицию to cо сдвигом ячеек внутри диапазона [from..to]
Void SimpleMove(Int32 from, Int32 to) Поменять местами ячейки в позициях from и to
Void AddRange(PFSubItem[] sub_items) Добавить пакет ячеек в строку
Void Add(PFSubItem sub_item) Добавить ячейку в конец строки.
Void Insert(Int32 index, PFSubItem sub_item) Вставка ячейки в строку в определенное место.
Void Remove(Int32 index) Удалить ячейку с определенным индексом из строки
Void Remove(PFSubItem sub_item) Удалить ячейку из строки
Void ClearSelection() Сбросить все флаги, обозначающие выделение ячейки
Void IndexOf(PFSubItem sub_item) Получить индекс соответствующего элемента
Свойство
Название Описание
PFSubItem Item(Int32 index) Индексатор
Bool EnableArrowing Разрешить или запретить показ стрелочек при изменении
Bool BorderedArrows Стрелочки с каймой
Bool EnableColoring Разрешить раскраску в динамические цвета
Color UpBackColor Цвет фона ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color DownBackColor Цвет фона ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color NoChangeBackColor Цвет фона ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color UpForeColor Цвет текста ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color DownForeColor Цвет текста ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color NoChangeForeColor Цвет текста ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color BackColor Цвет фона всех ячеек. Устанавливает данное свойство для всех ячеек.
Color ForeColor Свет символов всех ячеек. Устанавливает данное свойство для всех ячеек.
Класс – строка
PFS.GUI.Controls.PFSGrid.PFItem Объект — строка таблицы
Методы
Название Описание
Void SetSelected(Bool selected) Просто установить признак принадлежности к выделенным строкам. При этом, значение этого флага для всех остальных строк коллекции не изменяется.
Свойства
Название Описание
PFSubItemCollection SubItems Коллекция ячеек
Color BackColor Цвет фона. При установке распространяется на все ячейки строки.
Color RowBorderColor Цвет обрамления
Object Tag Ссылка на связанный со строкой объект
Object Obj Дополнительный связанный объект. Если установить его, то эта ссылка будет присвоена свойству Obj для всех ячеек. (Это основное отличие от свойства Tag)
Color ForeColor Цвет текста. При установке распространяется на все ячейки строки.
Bool Selected Флаг — строка выделена
Класс – коллекция строк
PFS.GUI.Controls.PFSGrid.PFItemCollection Коллекция строк
Методы
Название Описание
Void RollRight(Int32 count) Циклический сдвиг строки вправо на count позиций
Void RollRight() Циклический сдвиг строки вправо на одну позицию
Void RollLeft(Int32 count) Циклический сдвиг всех строк влево на count позиций
Void RollLeft() Циклический сдвиг всех строк влево на одну позицию
Void MoveRight(Int32 count) Сместить ячейку с индексом index во всех строках на одну позицию вправо
Void MoveLeft(Int32 count) Сместить ячейку с индексом index во всех строках на одну позицию влево
Void ShiftMove(Int32 from, Int32 to) Переместить колонку с позиции from на позицию to cо свигом ячеек внутри диапазона [from..to]
Void SimpleMove(Int32 from, Int32 to) Поменять местами ячейки в позициях from и to для всех строк.
Void SelectAllItems() Выделить все ячейки
Void AddRange(PFItem[] items) Добавить пакет строк
Void Add(PFItem item) Добавить строку в конец таблицы.
Void Insert(Int32 index, PFItem item) Рабочий метод. Добавить строку в коллекцию в место, определенное индексом nIndex
Void Clear() Удалить все строки. Рабочий метод
Void Remove(Int32 index) Удалить строку с индексом nItemIndex
Void Remove(PFItem item) Удалить строку из таблицы
Void ClearSelection() Сбросить всем строкам таблицы флаг выделения
Void ClearSelection(PFItem item) Сбросить флаг выделения всем строкам, кроме одной, ссылка на которую передается в качестве параметра
Int32 GetNextSelectedItemIndex(Int32 index) Определить номер выделенной строки, начиная поиск с позиции nStartIndex
Int32 FindItemIndex(PFItem item) Определить индекс выделенной строки
Bool IsItemPresent(PFItem item, Int32 from, Int32 to) Определить индекс выделенной строки. Поиск проводится в заданном диапазоне
Void Sort(IComparer comparer) Сортировка коллекции. В качестве параметра передается компаратор
Void Sort(Int32 column, SortDirections direction) Сортировка коллекции по колонке. Метод контролирует переданный на вход номер колонки и если он выходит за границы — ничего не делает
Свойства
Название Описание
PFItem Item(Int32 index) Индексатор
ArrayList SelectedItems Вернуть массив выделенных ячеек
ArrayList SelectedIndicies Вернуть массив индексов выделенных строк
Bool EnableArrowing Разрешить или запретить показ стрелочек при изменении
Bool BorderedArrows Стрелочки с каймой
Bool EnableColoring Разрешить раскраску в динамические цвета
Color UpBackColor Цвет фона ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color DownBackColor Цвет фона ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color NoChangeBackColor Цвет фона ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color UpForeColor Цвет текста ячейки при увеличении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color DownForeColor Цвет текста ячейки при уменьшении значения ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color NoChangeForeColor Цвет текста ячейки, если задаваемое значение равно значению ячейки. Данное свойство имеет смысл только для чисел. Устанавливает данное свойство для всех ячеек.
Color BackColor Цвет фона всех ячеек. Устанавливает данное свойство для всех ячеек.
Color ForeColor Свет символов всех ячеек. Устанавливает данное свойство для всех ячеек.

Вспомогательные типы.

Общие
PFS.GUI.Controls.PFSGrid.LineStyles Класс – описание вариантов для динамического свойства, описывающего стили линий. Этот класс необходим для определения содержимого выпадающего списка редактирования стиля линии. По умолчанию в динамическом свойстве устанавливается класс, описывающий стандартное перечисление DashStyle .NET Framework
Предопределенные значения
Название Описание
LineStyles Standard Описание встроенных в .NET Framework стилей линий
Свойство
Название Описание
String[] Names Массив имен стилей линий.
DashStyles[] Style Стиль отображения.
PFS.GUI.Controls.PFSGrid.PFSImageItem Класс – описание пиктограммы для ячейки выбора рисунка. При клонировании динамического свойства этот элемент не клонируется для нового экземпляра, а происходит простая передача ссылки.
Свойство
Название Описание
String Name Название пиктограммы
Image Style Пиктограмма
Object Tag Связанный с этой пиктограммой объект.
PFS.GUI.Controls.PFSGrid.FileTypes Класс – описание типа файла для ячейки выбора имени файла.
Методы
Название Описание
FileTypes(string type, string ext) Конструктор. В качестве параметра передаются тип файла и его расширение. Например FileTypes(«All files (*.*)», «*.*»). По умолчанию ячейка выбирает все файлы.
Аргументы событий редактирования

Щелчок (или двойной щелчок) по ячейке

PFS.GUI.Controls.PFSGrid.ClickEventArgs Событие — щелчок мыши
Свойство
Название Описание
Int32 ItemIndex Индекс строки, по которой щелкнули
Int 32 ColumnIndex Индекс столбца, по которому щелкнули

Изменение ширины колонки

PFS.GUI.Controls.PFSGrid.ColumnResizeEventArgs Аргументы события «Изменение ширины колонки»
Свойство
Название Описание
Int32 ColumnIndex Номер столбца
Int32 ColumnWidth Текущая ширина столбца
PFS.GUI.Controls.PFSGrid.CellEditEventArgs Аргументы для события — редактирование значения ячейки
Свойства
Название Описание
PFSubItem SubItem Ссылка на редактируемую ячейку.
Int32 CellCol Индекс выделенной колонки
Int32 CellRow Индекс выделенной строки
DynamicProperty Property Динамическое свойство, с которым связана ячейка
Bool Entered 1. Если true — редактируемые значения приняты 2. Если false — отмена принятия значений. 3. Tercium Non Datur :))

Щелчок мышью по кнопке в ячейке

PFS.GUI.Controls.PFSGrid.CellButtonArgs Аргументы события ButtonPushed
Свойства
Название Описание
Int32 Row Номер строки, в которой нажата кнопка
Int32 Col Номер столбца, в котором нажата кнопка

Изменение величины в элементе редактирования без завершения режима редактирования

PFS.GUI.Controls.PFSGrid.ValueChangeArgs Аргументы события ValueChange
Свойства
Название Описание
PFSubItem SubItem Ячейка, значение которой динамически редактируется
DynamicProperty NewValue Вернуть значение в формате DynamicProperty

Изменение индекса или текста в выпадающем списке без завершения редактирования

Перетягивание колонки или строки

PFS.GUI.Controls.PFSGrid.DragEventArgs Аргументы события перетягивания колонки или столбца
Константы
Название Описание
Int32 COLUMN_DRAGGED Перетянута колонка
Int32 ROW_DRAGGED Перетянута строка
Свойства
Название Описание
Int32 Action Описание действия, которое произошло.
Int32 From Исходная позиция колонки или строки
Int32 To Новая позиция колонки или строки
PFS.GUI.Controls.PFSGrid.SortEventArgs Аргументы события сортировки
Свойства
Название Описание
Int32 Column Номер колонки, по которой будет производится сортировка
SortDirection Direction Направление сортировки
Bool Cancel Отменить или разрешить сортировку. Если установить в true, то сортировка не будет произведена
Компараторы

Компараторы устанавливаются заголовкам колонок и определяют алгоритм сравнения строк при сортировке. Компаратор должен быть построен на базе стандартного базового компаратора PFBaseComparer и реализовывать стандартный интерфейс .NET IComparer.

PFS.GUI.Controls.PFSGrid.PFBaseComparer Базовый компаратор.На основе этого компаратора должны быть все компараторы
Свойства
Название Описание
SortDirection Direction Направление сортировки
Int32 Column Номер колонки для сортировки

Библиотекой уже предопределены три компаратора:

Илон Маск рекомендует:  Установка и использование Gulp
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL