Ana içeriğe atla

Basamaklı Düzenleyicilerin Kurulumu


Ülke => Şehir, Kurs => Sınıf Adı => Konu gibi çok seviyeli basamaklı editörlere ihtiyacınız olabilir.

Serenity 1.8.2 ile başlamak oldukça basittir. Arama düzenleyicileri bu entegre işlevselliğe sahiptir.

1.8.2'den önceki sürümler için de bu mümkündü ve Serene'de bazı örnekler vardı, ancak çalışması için bazı editör sınıfları tanımlamanız gerekiyordu.

Diyelim ki Ülke, Şehir, İlçe olmak üzere üç tablodan oluşan bir veritabanımız var:

  • Ülke Tablosu : CountryId, CountryName
  • Şehir Tablosu : CityId, CityName, CountryId
  • Bölge Tablosu : DistrictId, DistrictName, CityId

Öncelikle Sergen'i kullanarak her üç tablo için de kod oluşturduğunuzdan ve [LookupScript]hepsinde bir özelliğinizin olduğundan emin olun:

[LookupScript("MyModule.Country")]
public sealed class CountryRow : Row...
{
    [DisplayName("Country Id"), Identity]
    public Int32? CountryId
    {
        get { return Fields.CountryId[this]; }
        set { Fields.CountryId[this] = value; }
    }

    [DisplayName("Country Name"), Size(50), NotNull, QuickSearch]
    public String CountryName
    {
        get { return Fields.CountryName[this]; }
        set { Fields.CountryName[this] = value; }
    }
}
[LookupScript("MyModule.City")]
public sealed class CityRow : Row...
{
    [DisplayName("City Id"), Identity]
    public Int32? CityId
    {
        get { return Fields.CityId[this]; }
        set { Fields.CityId[this] = value; }
    }

    [DisplayName("City Name"), Size(50), NotNull, QuickSearch]
    public String CityName
    {
        get { return Fields.CityName[this]; }
        set { Fields.CityName[this] = value; }
    }
    
    [DisplayName("Country"), ForeignKey("Country", "CountryId"), LookupInclude]
    public Int32? CountryId
    {
        get { return Fields.CountryId[this]; }
        set { Fields.CountryId[this] = value; }
    }
    
}
[LookupScript("MyModule.District")]
public sealed class DistrictRow : Row...
{
    [DisplayName("District Id"), Identity]
    public Int32? DistrictId
    {
        get { return Fields.DistrictId[this]; }
        set { Fields.DistrictId[this] = value; }
    }

    [DisplayName("District Name"), Size(50), NotNull, QuickSearch]
    public String DistrictName
    {
        get { return Fields.DistrictName[this]; }
        set { Fields.DistrictName[this] = value; }
    }
    
    [DisplayName("City"), ForeignKey("City", "CityId"), LookupInclude]
    public Int32? CityId
    {
        get { return Fields.CityId[this]; }
        set { Fields.CityId[this] = value; }
    }
    
}

LookupIncludeDistrictRow'un CityId alanına ve CityRow'un CountryId alanına nitelik eklediğinizden emin olun . Bunların istemci tarafında bulunmasına ihtiyacımız var, aksi halde varsayılan olarak arama komut dosyalarına dahil edilmezler.

Bu alanları, örneğin CustomerForm gibi bir formda basamaklı arama düzenleyicileri olarak düzenlemek istiyorsanız, bunları şu şekilde ayarlarsınız:

[FormScript("MyModule.Customer")]
[BasedOnRow(typeof(Entities.CustomerRow))]
public class CustomerForm
{
    public String CustomerID { get; set; }
    public String CustomeraName { get; set; }
    
    [LookupEditor(typeof(Entities.CountryRow))]
    public Int32? CountryId { get; set; }
    
    [LookupEditor(typeof(Entities.CityRow), 
        CascadeFrom = "CountryId", CascadeField = "CountryId")]
    public Int32? CityId { get; set; }
    
    [LookupEditor(typeof(Entities.DistrictRow), 
        CascadeFrom = "CityId", CascadeField = "CityId")]
    public Int32? DistrictId { get; set; }
}

Bu özellikleri CustomerRow'da da ayarlayabilirsiniz.

Burada CascadeFrom özelliği şehir editörüne, bağlanacağı ana editörün kimliğini (cascade) bildirir.

Bu form oluşturulduğunda CountryId alanı CountryId ID'li bir editör ile işlenecek , dolayısıyla CityId arama editörünün CascadeFrom özelliğini bu ID'ye ayarladık .

CascadeField şehirlerin filtreleneceği alanı belirler. Böylece, ülke düzenleyici değeri değiştiğinde, şehir düzenleyici öğeleri CountryId özelliklerine göre şu şekilde filtrelenecektir :

   this.Items.Where(x => x.CountryId == CountryEditorValue)

CascadeFrom ve CascadeField öznitelikleri aynıysa , yalnızca CascadeFrom belirtmeniz gerekir , ancak burada açık olmak istedim.

Bu basamaklı düzenleyicileri müşteri kılavuzunun filtre çubuğuna eklemek istiyorsanız, CustomerGrid.cs'nin CreateToolbarExtensions yönteminde şunu yapın:

AddEqualityFilter<LookupEditor>("CountryId",
    options: new LookupEditorOptions 
    { 
        LookupKey = "MyModule.Country" 
    });
    
AddEqualityFilter<LookupEditor>("CityId", 
    options: new LookupEditorOptions 
    {
        LookupKey = "MyModule.City", 
        CascadeFrom = "CountryId",
        CascadeField = "CountryId"
    });

AddEqualityFilter<LookupEditor>("DistrictId", 
    options: new LookupEditorOptions 
    {
        LookupKey = "MyModule.District", 
        CascadeFrom = "CityId",
        CascadeField = "CityId"
    });

Burada, CustomerRow'da CountryId, CityId ve DistrictId alanlarınızın olduğunu varsayalım.

Artık hem düzenleme hem de filtreleme için kullanışlı basamaklı düzenleyicileriniz var.

Bu blogdaki popüler yayınlar

Code generetor ile oluşturulan dosyaların açıklamaları

  1. Sunum (Presentation/UI) Katmanı (Kullanıcı arayüzü - HTML, TypeScript, Dialog, Grid) 🔹 XYZPage.ts 📌 Ne İşe Yarar? Kullanıcı arayüzünün TypeScript tarafındaki tanımıdır. Serenity'nin Dialog ve Grid bileşenlerini içeren bir TypeScript sınıfıdır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcıdan veri almak ve göstermek için kullanılır. 🔹 XYZGrid.ts 📌 Ne İşe Yarar? Tablo (Grid) yapısını oluşturur ve verileri listeler. Filtreleme, sıralama ve sayfalama işlemleri için kullanılır. columnsKey ile hangi kolonların gösterileceğini belirler. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kullanıcının verileri listelediği ve etkileşimde bulunduğu yerdir. 🔹 XYZDialog.ts 📌 Ne İşe Yarar? CRUD (Create, Read, Update, Delete) işlemlerini yöneten pencere (modal) bileşeni Kullanıcı form aracılığıyla veri ekler, günceller veya siler. XYZForm.cs ile birlikte çalışır. 📌 Çok Katmanlı Mimarideki Yeri: Sunum Katmanı (Presentation Layer) Kull...

Serenity Web Nedir?

   Serenity  , açık kaynak teknolojileri üzerine kurulu bir ASP.NET Core/TypeScript uygulama platformudur. Standart kodlardan kaçınarak, tekrarlanan görevlere harcanan zamanı azaltarak ve en iyi yazılım tasarımı uygulamalarını uygulayarak bakım maliyetlerini düşürürken geliştirmeyi kolaylaştırmayı amaçlamaktadır. Serene  , Serenity platformunu temel alan ücretsiz, açık kaynaklı başlangıç ​​uygulama şablonumuzdur.  Bu dokümantasyon aracılığıyla eğitimimiz ve diğer örnekler için esas olarak Serene'yi kullanacağız. StartSharp  , ücretli müşterilerimize sunduğumuz premium uygulama şablonudur.  Daha gösterişli bir temaya ve bazı ekstra özelliklere  ek olarak Serene'deki her şeyi içerir  .  İkisi de Serenity platformunu temel alıyor. Adında Ne Var Serenity'nin sözlük anlamları  barış  ,  rahatlık  ve  sakinliktir  . Serenity ile bunu başarmaya çalışıyoruz.  Umarız yükledikten ve kullandıktan sonra siz de bu ş...