cxgrid lookupcombobox ve masterdetail ÇÖZÜLDÜ

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

cxgrid lookupcombobox ve masterdetail ÇÖZÜLDÜ

Mesaj gönderen mkysoft »

Arkadaşlar şöyle bir sıkımtım oldu. cx grid üzerinde 2 tane sütunum var. sağdaki sütuna girilebilecek değerleri lookupcombox'ile seçilebilir yaptım. Ancak seçilebilecek değerler soldaki sütunla ilişkili. bu nedenle lookupcomboboxnın listsource kısmına verileri sağlayan tabloyu master-detail yaptım. Şöyle bir problem oluştu. cxgridde satırı değiştirdiğimde daha önce seçmiş olduğum değerler siliniyor. Sanki her satırda bir lookupcombobox yokmuş da hepsi aynı lookupcomboboxmış gibi davranıyor. master-detail ilişkisini iptal edince düzeliyor.
Bununla ilgili, tablonun range özelliğini kullanarak bir düzeltme yapılabildiğini okudum ama benim tablo nesnemde range yok (zeos). Başka fikri olan varsa paylaşırsa sevinirim.
En son mkysoft tarafından 05 Ağu 2006 08:27 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

LookupComboBoxItem.Properties.OnInitPopup eventine kod yazarak DataSet'in Filter ve Filtered özellikleriyle oynayarak istediğinizi gerçekleştirebilirsiniz.

İyi çalışmalar.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Devexpress knowlodgebase'ine baktığımda bu problemin bilindiğini ama çözümünün imkansız olduğundan bahsetmiş. bunun yerine
ExtDbLookup nesnesinin View-inside-filtering özelliklerinden faydalanmasını önermiş.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

GridView nesnesinin OnEditing olayına;

Kod: Tümünü seç

var
  DC: TcxGridDBDataController;
  idxClass: Integer;
begin
  DC := TcxGridDBTableView(Sender).DataController;
  if TcxGridDBColumn(AItem).DataBinding.FieldName = 'lookup koyulan field' then
  begin
    idxClass := DC.GetItemByFieldName('filtreleme yapılacak değeri içeren field').Index;
    AAllow := not VarIsSoftNull(DC.Values[DC.FocusedRecordIndex, idxClass]);
  end
OnInitEdit olayına ise;

Kod: Tümünü seç

var
  MedClassValue: Variant;
  colMedClassIndex: Integer;
  DC: TcxGridDBDataController;
  LGrid: TcxCustomLookupDBGrid;
  colClassID: TcxLookupDBGridColumn;
begin
  DC := TcxGridDBDataController(Sender.DataController);
  colMedClassIndex := DC.GetItemByFieldName('filtreleme yapılacak değeri içeren field').Index;
  MedClassValue := DC.Values[DC.FocusedRecordIndex, colMedClassIndex];
  if AItem = gridview_lookup_olan_sütun then
  begin
    LGrid := TcxLookupComboBox(AEdit).Properties.Grid;
    colClassID := LGrid.Columns.ColumnByFieldName('filtreleme yapılacak değeri içeren field');
    with LGrid.DataController.Filter do
    begin
      Root.AddItem(colClassID, foEqual, MedClassValue, VarToStr(MedClassValue));
      Active := True;
    end;
  end;
Dikkat edilmesi gereken nokta şu;
lookup nesnesinde Listfield olarak mutlaka filtreleme yapılacak field'da bulunmalıdır. Bu field'ın genişliğini 0 yaparak görünmesini engelleyebilirsiniz.

Emeği geçenlere teşekkürler.

NOT: Devexpress knowledge bölümünde KB334 numarası ile anlatılmış çözümden faydalanılmıştır.
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

iyi çalışmalar hocam
Dediklerinizi aynen uyguladım. Verdiğiniz komut satırlarını aşağıdaki gibi konfigure ettim.

Kod: Tümünü seç

var
  DC: TcxGridDBDataController;
  idxClass: Integer;
begin
  DC := TcxGridDBTableView(Sender).DataController;
  if TcxGridDBColumn(AItem).DataBinding.FieldName = 'tasinir_hareket_tasinir_id' then
  begin
    idxClass := DC.GetItemByFieldName('tasinir_hareket_muhasebe').Index;
    AAllow := not VarIsSoftNull(DC.Values[DC.FocusedRecordIndex, idxClass]);
  end
end;

Kod: Tümünü seç

var
  MedClassValue: Variant;
  colMedClassIndex: Integer;
  DC: TcxGridDBDataController;
  LGrid: TcxCustomLookupDBGrid;
  colClassID: TcxLookupDBGridColumn;
begin
  DC := TcxGridDBDataController(Sender.DataController);
  colMedClassIndex := DC.GetItemByFieldName('tasinir_hareket_muhasebe').Index;
  MedClassValue := DC.Values[DC.FocusedRecordIndex, colMedClassIndex];
  if AItem = dbGrdHareketDBTableView1tasinir_hareket_tasinir_id then
  begin
    LGrid := TcxLookupComboBox(AEdit).Properties.Grid;
    colClassID := LGrid.Columns.ColumnByFieldName('tasinir_hareket_muhasebe');
    with LGrid.DataController.Filter do
    begin
      Root.AddItem(colClassID, foEqual, MedClassValue, VarToStr(MedClassValue));
      Active := True;
    end;
  end;
end;
tasinir_hareket_tasinir_id kolonu tasinir_hareket_muhasebe kolonuna göre filtrelenmesi gerekiyor. tabloda gerekli veriler mevcut, dediğiniz şekilde filtre uygulanacak alanıda listfields bölümüne ekledim fakat ilgili kolona veri girişi yapmaya çalıştığım vakit lookupdbgridte herhangibir listitem görüntülenmiyor. çalışma esnasında herhangibir hata da almıyorum. Filtreleme işlemini kaldırdığım vakit veriler geliyor. Fakat filtreme işleminden sonra herhangibir değer dönmüyor. Filtreleme için gelen değeri kontrol ettim doğru dönüyor.Bir yerleri atlıyorum galiba.
Yardımlarınız için teşekkürler ;
Saygılar;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

hocam başka bir yöntemle olayı çözdüm
Hakan Can'ın bahsettiği OnInıtPopup eventını kurcaladım biraz sizin kodlarıda alarak birleştirdim. aşağıdaki gibi bir şey çıktı. şu an problemsiz bir şekilde çalışıyor..

Kod: Tümünü seç

procedure TfrmTasinirIslemFisi.dbGrdHareketDBTableView1tasinir_hareket_tasinir_idPropertiesInitPopup(
  Sender: TObject);
var
 lcbProperties: TcxLookupComboBoxProperties;
 stFilter : string;
 i: integer;
 DC: TcxGridDBDataController;
 MedClassValue: Variant;
 colMedClassIndex: Integer;
begin
 DC := TcxGridDBDataController(dbGrdHareketDBTableView1.DataController);
 colMedClassIndex := DC.GetItemByFieldName('tasinir_hareket_muhasebe').Index;
 MedClassValue := DC.Values[DC.FocusedRecordIndex, colMedClassIndex];
 lcbProperties := TcxLookupComboBox(Sender).ActiveProperties;
 with lcbProperties.Grid.DataController do
 begin
  Filter.Root.AddItem(Grid.Columns[0], foEqual,MedClassValue, '');
  Filter.Active := True;
 end;
end;
Saygılar;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Cevapla