cxgrid filtreleme (birden fazla kolonu)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
berken
Üye
Mesajlar: 208
Kayıt: 07 Ara 2005 04:27
Konum: Van

cxgrid filtreleme (birden fazla kolonu)

Mesaj gönderen berken »

s.a.
arkadaslar bir alanı filtrelemek üzeler tıklayınca , aşağıda o kolonun değerleri sıralanıyor ...
birini seçtik mi ona göre filtreleme yapıyor..
ikinci bir kolonu filtreleme yapmak istediğimizde, filtre listesine görünen değerler değil de tüm değerler geliyor.. yani ikinci filtrenin itemleri ilk filtreyi dikkate almıyor..
..
bunu çözmenin bir yolu var mı ..
İnsanca.... Pek insanca....
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Elbette var.

cxGrid1DBBandedTableView1.DataController.Filter.AutoDataSetFilter := TRUE; yapmalısın (ister kodla ister Object Inspector'dan).

İyi çalışmalar.
Kullanıcı avatarı
berken
Üye
Mesajlar: 208
Kayıt: 07 Ara 2005 04:27
Konum: Van

Mesaj gönderen berken »

beni yanlış anladınız..
sanırım dediğiniz sey gride uyguladığın filtreyi dataset e yansıtıyorr..
bu dataseti yormaz mı..


mesela adı alanını mehmet diye süzdüm

10 kişi kaldı..
soyadı alanını süzmeye çalıştığımda sadece mehmet lerin soyadı gelsin.. oysa bende bütün soyadlar listeleniyor
İnsanca.... Pek insanca....
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bana da tam bu soru lazımdı isabet oldu, böyle birşey yapılabilir mi acaba?
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Elbette bu da mümkün.

cxGrid1DBBandedTableView1.DataController.Filter.OnGetValueList

eventi var. Orada istediğinizi biraz kod yazarak yapabilirsiniz. Helpinde güzel bir example da var.

Ben o eventle DataSet'in her hangi bir edit modunda olup olmadığını kontrol edip eğer edit modunda ise filtre işlemini ikaz ile abort ettiriyorum.

İyi çalışmalar.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Kod şu şekilde:

Kod: Tümünü seç

procedure TMyMainDataEntranceForm.cxGrid1DBBandedTableView1DataControllerFilterGetValueList(
  Sender: TcxFilterCriteria; AItemIndex: Integer;
  AValueList: TcxDataFilterValueList);
var
  I, F: Integer;
  St1: string;
  aRowInfo: TcxRowInfo;
  aList: TStringList;
begin
  if cxGrid1DBBandedTableView1.DataController.DataSet.State in dsEditModes then Abort;

  if cxGrid1DBBandedTableView1.Columns[AItemIndex].Filtered then Exit;

  if cxGrid1DBBandedTableView1.Columns[AItemIndex].DataBinding.FieldName <> '' then
    if not (cxGrid1DBBandedTableView1.Columns[AItemIndex].DataBinding.Field.DataType in [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftAutoInc, ftFixedChar, ftWideString, ftLargeint, ftTimeStamp, ftFMTBcd]) then Exit;

  if cxGrid1DBBandedTableView1.DataController.Filter.FilterText = '' then Exit;

  if cxGrid1DBBandedTableView1.DataController.FilteredRecordCount = cxGrid1DBBandedTableView1.DataController.RecordCount then Exit;

  aList := TStringList.Create;
  try
    Screen.Cursor := crHourGlass;
    aList.Sorted := TRUE;
    aList.CaseSensitive := TRUE;

    for I := 0 to cxGrid1DBBandedTableView1.DataController.RowCount - 1 do
    begin
      aRowInfo := cxGrid1DBBandedTableView1.DataController.GetRowInfo(I);

      if cxGrid1DBBandedTableView1.Columns[AItemIndex].GroupIndex < 0 then
        if aRowInfo.Level < cxGrid1DBBandedTableView1.DataController.Groups.GroupingItemCount then Continue;

      St1 := VarToStr(cxGrid1DBBandedTableView1.DataController.Values[aRowInfo.RecordIndex, AItemIndex]);

      if not aList.Find(St1, F) then aList.Add(St1);
    end;
    if aList.Count = 0 then Exit;

    for I := AValueList.Count - 1 downto 0 do
      if AValueList[I].Kind = fviValue then
        if not aList.Find(VarToStr(AValueList[I].Value), F) then AValueList.Delete(I);
  finally
    aList.Free;
    Screen.Cursor := crDefault;
  end;
end;
İyi çalışmalar.
Cevapla