Блог


Последние записи


Теги

Информация

Delphi, DevExpress, примеры, решения

Фильтр по тегу: lookupcombobox


Как получить видимое значение в строке типа LookupComboBox в TcxVerticalGrid?

Есть cxVerticalGrid со строкой (Properties.EditProperties) типа LookupComboBox. Как получить не значение ключевого поля, а именно то, значение, которое видит пользователь?

S := TcxLookupComboBoxProperties(cxEditorRow1.Properties.EditProperties).GetDisplayText(cxEditorRow1.Properties.Value);
добавлено: 14 ноя 14 просмотры: 2583, комментарии: 0



Выбор значения в cxExtLookupComboBox по щелчку (одинарный клик)

Есть TcxExtLookupComboBox, к которому привязан cxGrid из репозитория.
У cxExtLookupComboBox есть свойство FocusPopup типа boolean.
cxExtLookupComboBox1.Properties.FocusPopup := False;


Это свойство отвечает за то, что именно будет сфокусировано при выпадании списка: cxExtLookupComboBox или встроенный cxGridDBTableView? И от этого зависит, как будет происходить выбор нужной строки с помощью мышки: одним кликом или двумя. Если FocusPopup включен, то будет сфокусирован грид и выбор можно произвести двойным щелчком или клавишей Enter. Если FocusPopup отключен (False), то выбор можно произвести одним щелчком мышки.
добавлено: 20 июн 13 просмотры: 1501, комментарии: 0



Обращение к нужной колонке TcxLookupСombobox TcxDBLookupComboBox

Обращение к нужной колонке TcxLookupcombobox/TcxDBLookupComboBox
Получить данные не из 1 первой колонки TcxLookupcombobox/TcxDBLookupComboBox

with <TcxLookupCombobox>.Properties.Grid.DataController do
  caption := Values[FocusedRecordIndex, <ColumnIndex>];



cxDBLookupComboBox1.Properties.DataController.Values[cxDBLookupComboBox1.ItemIndex, Index колонки]);
добавлено: 19 июл 12 просмотры: 1966, комментарии: 0



Разные вопросы по DevExpress, cxGrid

Как узнать сфокусированную строку в гриде cxGridTableView?

AFocusedRecord := <Your>cxGridTableView.Controller.FocusedRecord


****

Как узнать в событии нажатия на кнопку, на какой колонке был клик?
Сохраняйте TcxGridRecordCellHitTest(Ht).Item из обработчика выше и анализируйте его в <YourcxGridDBTableView><YourField>PropertiesButtonClick


****

Как получить cxGrid по cxCustomGridTableView?
function cxGrid_FromTableView(TableView: TcxCustomGridTableView): TcxGrid; 
begin 
  if Assigned(TableView) and (TableView.Control is TcxGrid) then 
    Result := TcxGrid(TableView.Control) 
  else 
    Result := nil; 
end; 


или
<TcxGridDBTableView>.GetParentComponent



****

Как повесить TcxGridPopupMenu только на определенную колонку?
Следует обрабатывать событие OnPopup вашего TcxGridPopupMenu.
procedure <YourForm>.<YourcxGridPopupMenu>Popup(ASenderMenu: TComponent; AHitTest: TcxCustomGridHitTest; X, Y: Integer; var
    AllowPopup: Boolean);
begin
  AllowPopup := (AHitTest is TcxGridColumnHeaderHitTest ) and
      (TcxGridDBColumn(TcxGridColumnHeaderHitTest(AHitTest).Column).DataBinding.FieldName = '<YourColumnName>');
end;



Как вывести номер по порядку в столбце грида?
procedure TBaseDocWithRows.View1NumGetDisplayText(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: string); var
  Row: Integer;
begin
    inherited;
//    if ShowNumCol then
//    begin
        Row := Sender.GridView.DataController.GetRowInfo(Sender.GridView.DataController.GetRowIndexByRecordIndex(ARecord.RecordIndex, False)).DataRowIndex + 1; 
        AText := IntToStr(Row);
или // Row := Sender.GridView.DataController.GetRowIndexByRecordIndex(ARecord.RecordIndex, False)+1;
//    end;

//ARecord.RecordIndex
end;



****

Как после Locate установить (сфокусировать) найденную запись в центре грида?
По умолчанию, после Locate внутренние механизмы cxGrid отображают нужную запись в нижней половине представления.
procedure TForm1.Button1Click(Sender: TObject);
var
 Cnt: integer;
begin
  Cnt := cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.VisibleCount;
  Table1.Locate('CustNo',2156,[]);
  cxGrid1DBTableView1.Controller.TopRecordIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - Round((Cnt+1)/2);
end;



****

Как выводить изображение (картинку) в ячейку cxGrid в зависимости от значения поля?
Чтобы вывести в ячейках столбца картинки, надо на событие OnCustomDrawCell повесить код.
Пример.
procedure TForm1.cxGrid1DBTableView1VIP_StatusCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  VipStatus : string;
begin
  if not Assigned(AViewInfo) then  exit;

  try
    ACanvas.FillRect(AViewInfo.Bounds);
    ACanvas.Brush.Color := clWhite;
    if not VarIsNull(AViewInfo.DisplayValue) then
    begin
      VipStatus := AViewInfo.DisplayValue;
      if VipStatus = 'VIP' then
        ImageList.Draw(ACanvas.Canvas,AViewInfo.Bounds.Left+2,AViewInfo.Bounds.Top+2,0);

      if VipStatus = 'VIP Exec' then
        ImageList.Draw(ACanvas.Canvas,AViewInfo.Bounds.Left+2,AViewInfo.Bounds.Top+2,1);
    end;
  except
    on e:Exception do Sleep(0);
  end;
  ADone := true;// в этой строке не уверен
end;


****

Движение по гриду не зависимо от его сортировки
<View>.DataController.GotoNext



****

Как перерисовать cxGrid?
cxGrid1DBTableView1.LayoutChanged();


****


Как программно добавить столбец в cxGrid?
Добавляем колонку типа cxCheckBox (переключатель)
var 
f: TcxCheckBoxProperties;
 begin
 f:=TcxCheckBoxProperties.Create(self);
 f.NullStyle := nssUnchecked;
 f.ValueChecked:='true';
 f.ValueUnchecked:='false';
 f.ValueGrayed:='gray';
 f.DisplayChecked:='true';
 f.DisplayUnchecked:='false';
 f.DisplayGrayed:='gray';
 cxGrid1TableView1.CreateColumn.PropertiesClassName := 'TcxCheckBoxProperties';
 cxGrid1TableView1.Columns[0].Caption:='какое-то имя столбца';
 cxGrid1TableView1.Columns[0].Width:=150;
 cxGrid1TableView1.Columns[0].Properties := f;
 end;


****

Как показать/открыть редактор ячейки программно?
<TcxGrid1DBTableView>.Site.SetFocus(); //фокус устанавливать обязательно
<TcxGrid1DBTableView>.Controller.EditingController.ShowEdit(<cxGrid1DBColumn>);



****


Как запретить/разрешить редактирование текущей ячейки?
Следует обрабатывать событие <TcxGrid1DBTableView>.Editing, в котором использовать параметр AAllow
procedure cxGrid1TableView1Editing(Sender: TcxCustomGridTableView;
 AItem: TcxCustomGridTableItem; var AAllow: Boolean);
 begin
   AAllow := not ((AItem.Index = 1) and (Sender.Controller.FocusedRecordIndex = 1));
 end;



****


Как узнать RecordIndex выбранной/сфокусированной записи в любой момент
cxGrid1DBTableView1.DataController.FocusedRecordIndex



Как в колонке cxGrid`а вывести сумму с определённым форматом?
Например, если тип данных денежный, то поставь у колонки свойство DataBinding.ValueType := Currency и/или Properties := CurrencyEdit. Добавить на форму ТcxEditRepository в котором создать CurrencyItem и выставить DisplayFormat, равный DecimalPlaces. Затем назначить нужное колонке грида этот только что созданный RepositoryItem.
Или отформатировать DisplayFormat поля DataSeta.

****


Обращение к нужной колонке TcxLookupCombobox
Обратите внимание, что Properties.ListOptions.SyncMode должно иметь значение TRUE
with <TcxLookupCombobox>.Properties.Grid.DataController do
  caption := Values[FocusedRecordIndex, <ColumnIndex>];
добавлено: 13 июл 12 просмотры: 12151, комментарии: 0



Фильтр в cxLookupCombobox

2 варианта



Как сделать фильтрацию в TcxLookupCombobox?


Кроме стандартных для cxLookupCombobox свойств (ListSource, KeyFieldNames, ListFieldNames), нужно установить следующие значения:
<cxLookupCombobox>.Properties.DropDownListStyle  := lsEditList;
<cxLookupCombobox>.Properties.IncrementalFiltering := false;



Далее выполняем разделение строки на слова
// Разбивка строки по словам
procedure SplitDelimitedString(AStrings: TStrings; AText, ADelimiter: string);
var
  p, n: integer;
  Text: PChar;
begin
  Text := PChar(AText);
  AStrings.Clear;
  n := Length(ADelimiter);
  while Assigned(Text) do
  begin
    p := Pos(ADelimiter, Text) - 1;
    if p < 0 then
      Break;
    AStrings.Add(Copy(Text, 1, p));
    Inc(Text, p + n);
  end;
  if Assigned(Text) and (Length(Text) > 0) then
    AStrings.Add(Text);
end;



// Установка фильтра для полей lookup-а, с разбивкой по словам и полям
procedure ApplySearchFilter(Controller: TcxDBDataController; Fields: string; Text: string);
var
  i, j: integer;
  ItemLink: TObject;
  Filter: TcxDataFilterCriteria;
  FL: TcxFilterCriteriaItemList;
  FieldList, TextWords: TStrings;
begin
  TextWords := TStringList.Create;
  FieldList := TStringList.Create;
  try
    Filter := Controller.Filter;
    Filter.BeginUpdate;
    try
      Filter.Active := false;
      Filter.Clear;
      Filter.Options := Filter.Options + [fcoCaseInsensitive];
      Filter.Root.BoolOperatorKind := fboOr;
      SplitDelimitedString(FieldList, Fields, ';');
      SplitDelimitedString(TextWords, Text, ' ');
      for i := 0 to FieldList.Count - 1 do
        if FieldList[i] <> '' then
        begin
          FL := Filter.Root.AddItemList(fboAnd);
          ItemLink := Controller.GetItemByFieldName(FieldList[i]);
          if Assigned(ItemLink) then
            for j := 0 to TextWords.Count - 1 do
              if TextWords[j] <> '' then
                FL.AddItem(ItemLink, foLike, '%' + TextWords[j] + '%', TextWords[j]);
        end;
      Filter.Active := true;
    finally
      Filter.EndUpdate;
    end;
  finally
    TextWords.Free;
    FieldList.Free;
  end;
end;


// вызов
procedure TForm1.cxDBLookupComboBox1PropertiesChange(Sender: TObject);
var
  S: TcxDBLookupComboBox;
begin
  S := TcxDBLookupComboBox(Sender);
  ApplySearchFilter(S.Properties.DataController, S.Properties.ListFieldNames, S.Text);

  // для тестирования
  Label1.Caption := S.Properties.DataController.Filter.FilterText;
end;





Второй вариант
А ещё можно сделать связку cxGridViewRepository (TcxGridDBTableView) + TcxExtLookupCombobox и получить в выпадающем списке полноценную сетку - cxGridDBTableView
добавлено: 13 июл 12 просмотры: 2960, комментарии: 0



cxLookupCombobox - Установка фильтра для полей по словам

Установка фильтра для полей lookup-а, с разбивкой по словам и полям

procedure ApplySearchFilter(Controller:  TcxDBDataController; Fields: string; Text: string);
var
  i, j: Integer;
  ItemLink: TObject;
  Filter: TcxDataFilterCriteria;
  FL: TcxFilterCriteriaItemList;
  FieldList, TextWords: TStrings;
begin
  TextWords := TStringList.Create;
  FieldList := TStringList.Create;
  try
    Filter := Controller.Filter;
    Filter.BeginUpdate;
    try
      Filter.Active := false;
      Filter.Clear;
      Filter.Options := Filter.Options + ;
      Filter.Root.BoolOperatorKind := fboOr;
      SplitDelimitedString(FieldList, Fields, ';');
      SplitDelimitedString(TextWords, Text, ' ');
      for i := 0 to FieldList.Count - 1 do
        if FieldList <> '' then
        begin
          FL := Filter.Root.AddItemList(fboAnd);
          ItemLink := Controller.GetItemByFieldName(FieldList);
          if Assigned(ItemLink) then
            for j := 0 to TextWords.Count - 1 do
              if TextWords <> '' then
                FL.AddItem(ItemLink, foLike, '%' + TextWords + '%', TextWords);
        end;
      Filter.Active := true;
    finally
      Filter.EndUpdate;
    end;
  finally
    TextWords.Free;
    FieldList.Free;
  end;
end;



// Разбивка строки по словам
procedure SplitDelimitedString(AStrings: TStrings; AText, ADelimiter: string); var
  p, n: Integer;
  Text: PChar;
begin
  Text := PChar(AText);
  AStrings.Clear;
  n := Length(ADelimiter);
  while Assigned(Text) do
  begin
    p := Pos(ADelimiter, Text) - 1;
    if p < 0 then
      Break;
    AStrings.Add(Copy(Text, 1, p));
    Inc(Text, p + n);
  end;
  if Assigned(Text) and (Length(Text) > 0) then
    AStrings.Add(Text);
end;
добавлено: 12 июл 12 просмотры: 1323, комментарии: 2